diff options
50 files changed, 1499 insertions, 218 deletions
diff --git a/include/my_getopt.h b/include/my_getopt.h index 584c009464d..d1cdb9a2810 100644 --- a/include/my_getopt.h +++ b/include/my_getopt.h @@ -38,6 +38,7 @@ C_MODE_START #define GET_SET 13 #define GET_DOUBLE 14 #define GET_FLAGSET 15 +#define GET_BIT 16 #define GET_ASK_ADDR 128 #define GET_AUTO 64 diff --git a/mysql-test/include/check-warnings.test b/mysql-test/include/check-warnings.test index b2f73c32e35..be347ba46ec 100644 --- a/mysql-test/include/check-warnings.test +++ b/mysql-test/include/check-warnings.test @@ -36,7 +36,7 @@ create temporary table error_log ( let $log_error= $MTR_LOG_ERROR; let $log_warning= $log_error.warnings; -# Try tload the warnings into a temporary table, +# Try to load the warnings into a temporary table, # it might fail with error saying "The MySQL server is # running with the --secure-file-priv" in which case # an attempt to load the file using LOAD DATA LOCAL is made diff --git a/mysql-test/r/log_slow.result b/mysql-test/r/log_slow.result index 510bb929d84..47b8640c556 100644 --- a/mysql-test/r/log_slow.result +++ b/mysql-test/r/log_slow.result @@ -1,6 +1,6 @@ select @@log_slow_filter; @@log_slow_filter -admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk select @@log_slow_rate_limit; @@log_slow_rate_limit 1 @@ -10,7 +10,8 @@ select @@log_slow_verbosity; show variables like "log_slow%"; Variable_name Value log_slow_admin_statements ON -log_slow_filter admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +log_slow_disabled_statements sp +log_slow_filter admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk log_slow_rate_limit 1 log_slow_slave_statements ON log_slow_verbosity diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result index 45e9a670eb3..71397f6cc84 100644 --- a/mysql-test/r/mysqld--help.result +++ b/mysql-test/r/mysqld--help.result @@ -380,6 +380,9 @@ The following options may be given as the first argument: ALWAYS use row-based binary logging, the security issues do not exist and the binary logging cannot break, so you can safely set this to TRUE + --log-disabled-statements=name + Don't log certain types of statements to general log. Any + combination of: slave, sp --log-error[=name] Log errors to file (instead of stdout). If file name is not specified then 'datadir'/'log-basename'.err or the 'pid-file' path with extension .err is used @@ -388,7 +391,8 @@ The following options may be given as the first argument: FILE, TABLE --log-queries-not-using-indexes Log queries that are executed without benefit of any - index to the slow log if it is open + index to the slow log if it is open. Same as + log_slow_filter='not_using_index' --log-short-format Don't log extra information to update and slow-query logs. --log-slave-updates Tells the slave to log the updates from the slave thread @@ -396,12 +400,20 @@ The following options may be given as the first argument: plan to daisy-chain the slaves --log-slow-admin-statements Log slow OPTIMIZE, ANALYZE, ALTER and other - administrative statements to the slow log if it is open. - (Defaults to on; use --skip-log-slow-admin-statements to disable.) + administrative statements to the slow log if it is open. + Resets or sets the option 'admin' in + log_slow_disabled_statements + --log-slow-disabled-statements=name + Don't log certain types of statements to slow log. Any + combination of: admin, call, slave, sp --log-slow-filter=name - Log only certain types of queries. Any combination of: - admin, filesort, filesort_on_disk, full_join, full_scan, - query_cache, query_cache_miss, tmp_table, + 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. Any + combination of: admin, filesort, filesort_on_disk, + filsort_priority_queue, full_join, full_scan, + not_using_index, query_cache, query_cache_miss, tmp_table, tmp_table_on_disk --log-slow-rate-limit=# Write to slow log every #th slow query. Set to 1 to log @@ -409,8 +421,8 @@ The following options may be given as the first argument: the performance impact of slow logging --log-slow-slave-statements Log slow statements executed by slave thread to the slow - log if it is open. - (Defaults to on; use --skip-log-slow-slave-statements to disable.) + log if it is open. Resets or sets the option 'slave' in + log_slow_disabled_statements --log-slow-verbosity=name Verbosity level for the slow log. Any combination of: innodb, query_plan, explain @@ -1320,6 +1332,7 @@ log-bin-compress FALSE log-bin-compress-min-len 256 log-bin-index (No default value) log-bin-trust-function-creators FALSE +log-disabled-statements sp log-error log-isam myisam.log log-output FILE @@ -1327,7 +1340,8 @@ log-queries-not-using-indexes FALSE log-short-format FALSE log-slave-updates FALSE log-slow-admin-statements TRUE -log-slow-filter admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +log-slow-disabled-statements sp +log-slow-filter admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk log-slow-rate-limit 1 log-slow-slave-statements TRUE log-slow-verbosity diff --git a/mysql-test/r/set_statement.result b/mysql-test/r/set_statement.result index 406ca99a5ea..11d8c6f931f 100644 --- a/mysql-test/r/set_statement.result +++ b/mysql-test/r/set_statement.result @@ -1047,7 +1047,7 @@ set statement long_query_time=default for select @@long_query_time; 10.000000 set statement log_slow_filter=default for select @@log_slow_filter; @@log_slow_filter -admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk set statement log_slow_verbosity=default for select @@log_slow_verbosity; @@log_slow_verbosity diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index bf4627f6f68..38a7bd8e1c2 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -1236,7 +1236,7 @@ select 1 from information_schema.tables limit 1; show status like 'slow_queries'; Variable_name Value Slow_queries 1 -set global log_queries_not_using_indexes=OFF; +set session log_queries_not_using_indexes=OFF; show variables like "log_queries_not_using_indexes"; Variable_name Value log_queries_not_using_indexes OFF @@ -1246,7 +1246,7 @@ select 1 from information_schema.tables limit 1; show status like 'slow_queries'; Variable_name Value Slow_queries 1 -set global log_queries_not_using_indexes=ON; +set session log_queries_not_using_indexes=ON; show variables like "log_queries_not_using_indexes"; Variable_name Value log_queries_not_using_indexes ON diff --git a/mysql-test/suite/sys_vars/r/log_disabled_statements_basic.result b/mysql-test/suite/sys_vars/r/log_disabled_statements_basic.result new file mode 100644 index 00000000000..72bc8449f13 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_disabled_statements_basic.result @@ -0,0 +1,60 @@ +SET @start_global_value = @@global.log_disabled_statements; +select @@global.log_disabled_statements; +@@global.log_disabled_statements +sp +select @@session.log_disabled_statements; +@@session.log_disabled_statements +sp +show global variables like 'log_disabled_statements'; +Variable_name Value +log_disabled_statements sp +show session variables like 'log_disabled_statements'; +Variable_name Value +log_disabled_statements sp +select * from information_schema.global_variables where variable_name='log_disabled_statements'; +VARIABLE_NAME VARIABLE_VALUE +LOG_DISABLED_STATEMENTS sp +select * from information_schema.session_variables where variable_name='log_disabled_statements'; +VARIABLE_NAME VARIABLE_VALUE +LOG_DISABLED_STATEMENTS sp +set global log_disabled_statements=1; +select @@global.log_disabled_statements; +@@global.log_disabled_statements +slave +set session log_disabled_statements=1; +select @@session.log_disabled_statements; +@@session.log_disabled_statements +slave +set session log_disabled_statements=1; +select @@session.log_disabled_statements; +@@session.log_disabled_statements +slave +set session log_disabled_statements=2; +select @@session.log_disabled_statements; +@@session.log_disabled_statements +sp +set session log_disabled_statements='slave'; +select @@session.log_disabled_statements; +@@session.log_disabled_statements +slave +set session log_disabled_statements='sp'; +select @@session.log_disabled_statements; +@@session.log_disabled_statements +sp +set session log_disabled_statements='slave,sp'; +select @@session.log_disabled_statements; +@@session.log_disabled_statements +slave,sp +set session log_disabled_statements=''; +select @@session.log_disabled_statements; +@@session.log_disabled_statements + +set session log_disabled_statements=1.1; +ERROR 42000: Incorrect argument type to variable 'log_disabled_statements' +set session log_disabled_statements=1e1; +ERROR 42000: Incorrect argument type to variable 'log_disabled_statements' +set session log_disabled_statements="foo"; +ERROR 42000: Variable 'log_disabled_statements' can't be set to the value of 'foo' +set session log_disabled_statements=1024; +ERROR 42000: Variable 'log_disabled_statements' can't be set to the value of '1024' +SET @@global.log_disabled_statements = @start_global_value; diff --git a/mysql-test/suite/sys_vars/r/log_disabled_statements_func.result b/mysql-test/suite/sys_vars/r/log_disabled_statements_func.result new file mode 100644 index 00000000000..4cfb2adbaac --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_disabled_statements_func.result @@ -0,0 +1,82 @@ +SET @old_log_output= @@global.log_output; +SET @old_log_disable_statements= @@global.log_disabled_statements; +CREATE TABLE t1 (i INT PRIMARY KEY AUTO_INCREMENT, j VARCHAR(255) ) ENGINE=MyISAM; +insert into t1 (j) values ('a'),('b'),('c'),('d'); +SET GLOBAL log_output = 'file,table'; +CREATE PROCEDURE slow() +BEGIN +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b'; +SELECT count(*) from t1 where j>'a'; +END +$ +select @@log_disabled_statements; +@@log_disabled_statements +sp +TRUNCATE TABLE mysql.general_log; +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +CALL slow(); +count(if(sleep(1) >= 0,0,NULL)) +2 +count(*) +3 +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2'; +count(if(sleep(1) >= 0,0,NULL)) +2 +--> +SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; +argument +check table t1 +CALL slow() +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2' +<-- +TRUNCATE TABLE mysql.general_log; +SET SESSION log_disabled_statements=""; +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +CALL slow(); +count(if(sleep(1) >= 0,0,NULL)) +2 +count(*) +3 +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3'; +count(if(sleep(1) >= 0,0,NULL)) +2 +--> +SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; +argument +SET SESSION log_disabled_statements="" +check table t1 +CALL slow() +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b' +SELECT count(*) from t1 where j>'a' +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3' +<-- +TRUNCATE TABLE mysql.general_log; +SET SESSION log_disabled_statements="sp,slave"; +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +CALL slow(); +count(if(sleep(1) >= 0,0,NULL)) +2 +count(*) +3 +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4'; +count(if(sleep(1) >= 0,0,NULL)) +2 +--> +SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; +argument +SET SESSION log_disabled_statements="sp,slave" +check table t1 +CALL slow() +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4' +<-- +DROP TABLE t1; +DROP PROCEDURE slow; +TRUNCATE TABLE mysql.general_log; +SET @@global.log_output= @old_log_output; +SET @@global.log_disabled_statements= @old_log_disable_statements; diff --git a/mysql-test/suite/sys_vars/r/log_queries_not_using_indexes_basic.result b/mysql-test/suite/sys_vars/r/log_queries_not_using_indexes_basic.result index fcb5abbcf91..8952caac8b0 100644 --- a/mysql-test/suite/sys_vars/r/log_queries_not_using_indexes_basic.result +++ b/mysql-test/suite/sys_vars/r/log_queries_not_using_indexes_basic.result @@ -1,4 +1,9 @@ SET @start_value= @@global.log_queries_not_using_indexes; +SET @filter_start_value= @@global.log_slow_filter; +SET @@global.log_queries_not_using_indexes= TRUE; +SET @@session.log_queries_not_using_indexes= TRUE; +SET @@global.log_queries_not_using_indexes= FALSE; +SET @@session.log_queries_not_using_indexes= FALSE; SET @@global.log_queries_not_using_indexes= DEFAULT; SELECT @@global.log_queries_not_using_indexes; @@global.log_queries_not_using_indexes @@ -61,16 +66,41 @@ SET @@global.log_queries_not_using_indexes= @badvar; ERROR 42000: Variable 'log_queries_not_using_indexes' can't be set to the value of 'true' SET GLOBAL log_queries_not_using_indexes= 'DEFAULT'; ERROR 42000: Variable 'log_queries_not_using_indexes' can't be set to the value of 'DEFAULT' -SET log_queries_not_using_indexes= TRUE; -ERROR HY000: Variable 'log_queries_not_using_indexes' is a GLOBAL variable and should be set with SET GLOBAL -SET SESSION log_queries_not_using_indexes= TRUE; -ERROR HY000: Variable 'log_queries_not_using_indexes' is a GLOBAL variable and should be set with SET GLOBAL -SET @@session.log_queries_not_using_indexes= TRUE; -ERROR HY000: Variable 'log_queries_not_using_indexes' is a GLOBAL variable and should be set with SET GLOBAL -SET LOCAL log_queries_not_using_indexes= TRUE; -ERROR HY000: Variable 'log_queries_not_using_indexes' is a GLOBAL variable and should be set with SET GLOBAL SET @@global log_queries_not_using_indexes= TRUE; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'log_queries_not_using_indexes= TRUE' at line 1 SET @@SESSION log_queries_not_using_indexes= TRUE; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'log_queries_not_using_indexes= TRUE' at line 1 +SET @@SESSION.log_queries_not_using_indexes= TRUE; +select @@SESSION.log_slow_filter; +@@SESSION.log_slow_filter +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,not_using_index,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +SET @@SESSION.log_queries_not_using_indexes= FALSE; +select @@SESSION.log_slow_filter; +@@SESSION.log_slow_filter +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +SET @@GLOBAL.log_queries_not_using_indexes= TRUE; +select @@GLOBAL.log_slow_filter; +@@GLOBAL.log_slow_filter +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,not_using_index,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +SET @@GLOBAL.log_queries_not_using_indexes= FALSE; +select @@GLOBAL.log_slow_filter; +@@GLOBAL.log_slow_filter +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +SET @@SESSION.log_slow_filter=""; +select @@SESSION.log_queries_not_using_indexes; +@@SESSION.log_queries_not_using_indexes +0 +SET @@SESSION.log_slow_filter="not_using_index"; +select @@SESSION.log_queries_not_using_indexes; +@@SESSION.log_queries_not_using_indexes +1 +SET @@GLOBAL.log_slow_filter=""; +select @@GLOBAL.log_queries_not_using_indexes; +@@GLOBAL.log_queries_not_using_indexes +0 +SET @@GLOBAL.log_slow_filter="not_using_index"; +select @@GLOBAL.log_queries_not_using_indexes; +@@GLOBAL.log_queries_not_using_indexes +1 SET @@global.log_queries_not_using_indexes= @start_value; +SET @@global.log_slow_filter= @filter_start_value; diff --git a/mysql-test/suite/sys_vars/r/log_result_errors_basic.result b/mysql-test/suite/sys_vars/r/log_result_errors_basic.result new file mode 100644 index 00000000000..5d3696901a6 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_result_errors_basic.result @@ -0,0 +1,148 @@ +SET @start_global_value = @@global.log_result_errors; +SELECT @start_global_value; +@start_global_value +0 +SET @start_session_value = @@session.log_result_errors; +SELECT @start_session_value; +@start_session_value +0 +'#--------------------FN_DYNVARS_067_01-------------------------#' +SET @@global.log_result_errors = 1; +SET @@global.log_result_errors = DEFAULT; +SELECT @@global.log_result_errors; +@@global.log_result_errors +0 +SET @@session.log_result_errors = 2; +SET @@session.log_result_errors = DEFAULT; +SELECT @@session.log_result_errors; +@@session.log_result_errors +0 +'#--------------------FN_DYNVARS_067_02-------------------------#' +SET @@global.log_result_errors = DEFAULT; +SELECT @@global.log_result_errors = 0; +@@global.log_result_errors = 0 +1 +SET @@session.log_result_errors = DEFAULT; +SELECT @@session.log_result_errors = 0; +@@session.log_result_errors = 0 +1 +'#--------------------FN_DYNVARS_067_03-------------------------#' +SET @@global.log_result_errors = 0; +SELECT @@global.log_result_errors; +@@global.log_result_errors +0 +SET @@global.log_result_errors = 1; +SELECT @@global.log_result_errors; +@@global.log_result_errors +1 +SET @@global.log_result_errors = 3; +SELECT @@global.log_result_errors; +@@global.log_result_errors +3 +'#--------------------FN_DYNVARS_067_04-------------------------#' +SET @@session.log_result_errors = 0; +SELECT @@session.log_result_errors; +@@session.log_result_errors +0 +SET @@session.log_result_errors = 1; +SELECT @@session.log_result_errors; +@@session.log_result_errors +1 +SET @@session.log_result_errors = 3; +SELECT @@session.log_result_errors; +@@session.log_result_errors +3 +'#------------------FN_DYNVARS_067_05-----------------------#' +SET @@global.log_result_errors = 4; +Warnings: +Warning 1292 Truncated incorrect log_result_errors value: '4' +SELECT @@global.log_result_errors; +@@global.log_result_errors +3 +SET @@global.log_result_errors = 65530.34; +ERROR 42000: Incorrect argument type to variable 'log_result_errors' +SELECT @@global.log_result_errors; +@@global.log_result_errors +3 +SET @@global.log_result_errors = test; +ERROR 42000: Incorrect argument type to variable 'log_result_errors' +SELECT @@global.log_result_errors; +@@global.log_result_errors +3 +SET @@session.log_result_errors = -2; +Warnings: +Warning 1292 Truncated incorrect log_result_errors value: '-2' +SELECT @@session.log_result_errors; +@@session.log_result_errors +0 +SET @@session.log_result_errors = 65530.34; +ERROR 42000: Incorrect argument type to variable 'log_result_errors' +SET @@session.log_result_errors = test; +ERROR 42000: Incorrect argument type to variable 'log_result_errors' +SELECT @@session.log_result_errors; +@@session.log_result_errors +0 +'#------------------FN_DYNVARS_067_06-----------------------#' +SELECT @@global.log_result_errors = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME='log_result_errors'; +@@global.log_result_errors = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_067_07-----------------------#' +SELECT @@session.log_result_errors = VARIABLE_VALUE +FROM INFORMATION_SCHEMA.SESSION_VARIABLES +WHERE VARIABLE_NAME='log_result_errors'; +@@session.log_result_errors = VARIABLE_VALUE +1 +'#------------------FN_DYNVARS_067_08-----------------------#' +SET @@global.log_result_errors = TRUE; +SELECT @@global.log_result_errors; +@@global.log_result_errors +1 +SET @@global.log_result_errors = FALSE; +SELECT @@global.log_result_errors; +@@global.log_result_errors +0 +'#---------------------FN_DYNVARS_067_09----------------------#' +SET @@session.log_result_errors = 1; +SET @@global.log_result_errors = 2; +SELECT @@log_result_errors = @@global.log_result_errors; +@@log_result_errors = @@global.log_result_errors +0 +'#---------------------FN_DYNVARS_067_10----------------------#' +SET @@session.log_result_errors = 1; +SET @@global.log_result_errors = 2; +SELECT @@log_result_errors = @@local.log_result_errors; +@@log_result_errors = @@local.log_result_errors +1 +SELECT @@local.log_result_errors = @@session.log_result_errors; +@@local.log_result_errors = @@session.log_result_errors +1 +SET @@session.log_result_errors = 1; +create table t1(a int primary key); +insert into t1 values(1); +insert into t1 values(1); +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +insert ignore into t1 values(1); +Warnings: +Warning 1062 Duplicate entry '1' for key 'PRIMARY' +SET @@session.log_result_errors = 3; +insert ignore into t1 values(1); +Warnings: +Warning 1062 Duplicate entry '1' for key 'PRIMARY' +drop table t1; +SET @@global.log_result_errors = @start_global_value; +SELECT @@global.log_result_errors; +@@global.log_result_errors +0 +SET @@session.log_result_errors = @start_session_value; +SELECT @@session.log_result_errors; +@@session.log_result_errors +0 +[WARN RESULT] affected_rows: 0 status: 2 warning_count: 1 +[WARN RESULT] Level: Warning Code: 1292 'Truncated incorrect log_result_errors value: '4'' +[ERROR RESULT] Code: 1232 'Incorrect argument type to variable 'log_result_errors'' +[ERROR RESULT] Code: 1232 'Incorrect argument type to variable 'log_result_errors'' +[ERROR RESULT] Code: 1062 'Duplicate entry '1' for key 'PRIMARY'' +[WARN RESULT] affected_rows: 0 status: 2 warning_count: 1 +[WARN RESULT] Level: Warning Code: 1062 'Duplicate entry '1' for key 'PRIMARY'' diff --git a/mysql-test/suite/sys_vars/r/log_slow_admin_statements_func.result b/mysql-test/suite/sys_vars/r/log_slow_admin_statements_func.result index daddc4af627..95916d8ce15 100644 --- a/mysql-test/suite/sys_vars/r/log_slow_admin_statements_func.result +++ b/mysql-test/suite/sys_vars/r/log_slow_admin_statements_func.result @@ -10,7 +10,7 @@ j VARCHAR(255) SET GLOBAL log_output = 'file,table'; SET GLOBAL slow_query_log = on; SET SESSION long_query_time = 0; -SET GLOBAL log_slow_admin_statements = on; +SET SESSION log_slow_admin_statements = on; ALTER TABLE log_slow_admin_statements ADD COLUMN k INT DEFAULT 17; CREATE PROCEDURE add_rows() BEGIN @@ -44,3 +44,37 @@ SET @@session.long_query_time= @old_long_query_time; SET @@global.log_slow_admin_statements= @old_log_slow_admin_statements; DROP PROCEDURE add_rows; TRUNCATE TABLE mysql.slow_log; +SET @save_log_slow_disabled_statements= @@global.log_slow_disabled_statements; +SET @@SESSION.log_slow_admin_statements= TRUE; +select @@SESSION.log_slow_disabled_statements; +@@SESSION.log_slow_disabled_statements +sp +SET @@SESSION.log_slow_admin_statements= FALSE; +select @@SESSION.log_slow_disabled_statements; +@@SESSION.log_slow_disabled_statements +admin,sp +SET @@GLOBAL.log_slow_admin_statements= TRUE; +select @@GLOBAL.log_slow_disabled_statements; +@@GLOBAL.log_slow_disabled_statements +sp +SET @@GLOBAL.log_slow_admin_statements= FALSE; +select @@GLOBAL.log_slow_disabled_statements; +@@GLOBAL.log_slow_disabled_statements +admin,sp +SET @@SESSION.log_slow_disabled_statements=""; +select @@SESSION.log_slow_admin_statements; +@@SESSION.log_slow_admin_statements +1 +SET @@SESSION.log_slow_disabled_statements="admin"; +select @@SESSION.log_slow_admin_statements; +@@SESSION.log_slow_admin_statements +0 +SET @@GLOBAL.log_slow_disabled_statements=""; +select @@GLOBAL.log_slow_admin_statements; +@@GLOBAL.log_slow_admin_statements +1 +SET @@GLOBAL.log_slow_disabled_statements="admin"; +select @@GLOBAL.log_slow_admin_statements; +@@GLOBAL.log_slow_admin_statements +0 +SET @@global.log_slow_disabled_statements= @save_log_slow_disabled_statements; diff --git a/mysql-test/suite/sys_vars/r/log_slow_disabled_statements_basic.result b/mysql-test/suite/sys_vars/r/log_slow_disabled_statements_basic.result new file mode 100644 index 00000000000..7ef4931a288 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_slow_disabled_statements_basic.result @@ -0,0 +1,72 @@ +SET @start_global_value = @@global.log_slow_disabled_statements; +select @@global.log_slow_disabled_statements; +@@global.log_slow_disabled_statements +sp +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +sp +show global variables like 'log_slow_disabled_statements'; +Variable_name Value +log_slow_disabled_statements sp +show session variables like 'log_slow_disabled_statements'; +Variable_name Value +log_slow_disabled_statements sp +select * from information_schema.global_variables where variable_name='log_slow_disabled_statements'; +VARIABLE_NAME VARIABLE_VALUE +LOG_SLOW_DISABLED_STATEMENTS sp +select * from information_schema.session_variables where variable_name='log_slow_disabled_statements'; +VARIABLE_NAME VARIABLE_VALUE +LOG_SLOW_DISABLED_STATEMENTS sp +set global log_slow_disabled_statements=1; +select @@global.log_slow_disabled_statements; +@@global.log_slow_disabled_statements +admin +set session log_slow_disabled_statements=1; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +admin +set session log_slow_disabled_statements=1; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +admin +set session log_slow_disabled_statements=2; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +call +set session log_slow_disabled_statements=5; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +admin,slave +set session log_slow_disabled_statements='admin'; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +admin +set session log_slow_disabled_statements='slave'; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +slave +set session log_slow_disabled_statements='call'; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +call +set session log_slow_disabled_statements='sp'; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +sp +set session log_slow_disabled_statements='admin,sp,call,slave'; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements +admin,call,slave,sp +set session log_slow_disabled_statements=''; +select @@session.log_slow_disabled_statements; +@@session.log_slow_disabled_statements + +set session log_slow_disabled_statements=1.1; +ERROR 42000: Incorrect argument type to variable 'log_slow_disabled_statements' +set session log_slow_disabled_statements=1e1; +ERROR 42000: Incorrect argument type to variable 'log_slow_disabled_statements' +set session log_slow_disabled_statements="foo"; +ERROR 42000: Variable 'log_slow_disabled_statements' can't be set to the value of 'foo' +set session log_slow_disabled_statements=1024; +ERROR 42000: Variable 'log_slow_disabled_statements' can't be set to the value of '1024' +SET @@global.log_slow_disabled_statements = @start_global_value; diff --git a/mysql-test/suite/sys_vars/r/log_slow_disabled_statements_func.result b/mysql-test/suite/sys_vars/r/log_slow_disabled_statements_func.result new file mode 100644 index 00000000000..80a723a305d --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_slow_disabled_statements_func.result @@ -0,0 +1,166 @@ +SET @old_log_output= @@global.log_output; +SET @old_slow_query_log= @@global.slow_query_log; +SET @old_long_query_time= @@session.long_query_time; +SET @old_log_slow_disable_statements= @@global.log_slow_disabled_statements; +SET @@session.log_slow_verbosity="explain,innodb,query_plan"; +CREATE TABLE t1 (i INT PRIMARY KEY AUTO_INCREMENT, j blob) ENGINE=MyISAM; +insert into t1 (j) values ('a'),('b'),('c'),('d'); +create table t2 (a int auto_increment primary key) engine=myisam; +SET GLOBAL log_output = 'file,table'; +SET GLOBAL slow_query_log = on; +CREATE PROCEDURE slow() +BEGIN +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b'; +SELECT count(*) from t1 where j>'a'; +insert into t2 () values(); +END +$ +CREATE PROCEDURE slow2() +BEGIN +SELECT j,count(*) from t1 group by j; +create temporary table t3 (a int); +alter table t3 add column (b int); +call slow(); +drop temporary table t3; +SELECT j,count(*)+1 from t1 group by j,i; +END +$ +SET SESSION long_query_time = 0; +SELECT @@log_slow_disabled_statements; +@@log_slow_disabled_statements +sp +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra int; +CALL slow2(); +j count(*) +a 1 +b 1 +c 1 +d 1 +count(if(sleep(1) >= 0,0,NULL)) +2 +count(*) +3 +j count(*)+1 +a 2 +b 2 +c 2 +d 2 +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2'; +count(if(sleep(1) >= 0,0,NULL)) +2 +--> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +sql_text +TRUNCATE TABLE mysql.slow_log +ALTER TABLE t1 add column extra int +CALL slow2() +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2' +<-- +SET SESSION log_slow_disabled_statements="call,admin"; +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra2 int; +CALL slow2(); +j count(*) +a 1 +b 1 +c 1 +d 1 +count(if(sleep(1) >= 0,0,NULL)) +2 +count(*) +3 +j count(*)+1 +a 2 +b 2 +c 2 +d 2 +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3'; +count(if(sleep(1) >= 0,0,NULL)) +2 +--> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +sql_text +TRUNCATE TABLE mysql.slow_log +SELECT j,count(*) from t1 group by j +create temporary table t3 (a int) +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b' +SELECT count(*) from t1 where j>'a' +insert into t2 () values() +drop temporary table t3 +SELECT j,count(*)+1 from t1 group by j,i +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3' +<-- +SET SESSION log_slow_disabled_statements=""; +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra3 int; +CALL slow2(); +j count(*) +a 1 +b 1 +c 1 +d 1 +count(if(sleep(1) >= 0,0,NULL)) +2 +count(*) +3 +j count(*)+1 +a 2 +b 2 +c 2 +d 2 +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4'; +count(if(sleep(1) >= 0,0,NULL)) +2 +--> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +sql_text +TRUNCATE TABLE mysql.slow_log +ALTER TABLE t1 add column extra3 int +SELECT j,count(*) from t1 group by j +create temporary table t3 (a int) +alter table t3 add column (b int) +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b' +SELECT count(*) from t1 where j>'a' +insert into t2 () values() +call slow() +drop temporary table t3 +SELECT j,count(*)+1 from t1 group by j,i +CALL slow2() +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4' +<-- +SET SESSION log_slow_disabled_statements="call,admin,slave,sp"; +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra4 int; +CALL slow2(); +j count(*) +a 1 +b 1 +c 1 +d 1 +count(if(sleep(1) >= 0,0,NULL)) +2 +count(*) +3 +j count(*)+1 +a 2 +b 2 +c 2 +d 2 +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part5'; +count(if(sleep(1) >= 0,0,NULL)) +2 +--> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +sql_text +TRUNCATE TABLE mysql.slow_log +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part5' +<-- +DROP TABLE t1,t2; +DROP PROCEDURE slow; +DROP PROCEDURE slow2; +SET @@session.long_query_time= @old_long_query_time; +TRUNCATE TABLE mysql.slow_log; +SET @@global.log_output= @old_log_output; +SET @@global.slow_query_log= @old_slow_query_log; +SET @@global.log_slow_disabled_statements= @old_log_slow_disable_statements; diff --git a/mysql-test/suite/sys_vars/r/log_slow_filter_basic.result b/mysql-test/suite/sys_vars/r/log_slow_filter_basic.result index 5b6eccf2185..0d2549bdbf1 100644 --- a/mysql-test/suite/sys_vars/r/log_slow_filter_basic.result +++ b/mysql-test/suite/sys_vars/r/log_slow_filter_basic.result @@ -1,22 +1,22 @@ SET @start_global_value = @@global.log_slow_filter; select @@global.log_slow_filter; @@global.log_slow_filter -admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk select @@session.log_slow_filter; @@session.log_slow_filter -admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk show global variables like 'log_slow_filter'; Variable_name Value -log_slow_filter admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +log_slow_filter admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk show session variables like 'log_slow_filter'; Variable_name Value -log_slow_filter admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +log_slow_filter admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk select * from information_schema.global_variables where variable_name='log_slow_filter'; VARIABLE_NAME VARIABLE_VALUE -LOG_SLOW_FILTER admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +LOG_SLOW_FILTER admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk select * from information_schema.session_variables where variable_name='log_slow_filter'; VARIABLE_NAME VARIABLE_VALUE -LOG_SLOW_FILTER admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +LOG_SLOW_FILTER admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk set global log_slow_filter=1; select @@global.log_slow_filter; @@global.log_slow_filter @@ -57,6 +57,10 @@ set session log_slow_filter='full_scan'; select @@session.log_slow_filter; @@session.log_slow_filter full_scan +set session log_slow_filter='not_using_index'; +select @@session.log_slow_filter; +@@session.log_slow_filter +not_using_index set session log_slow_filter='query_cache'; select @@session.log_slow_filter; @@session.log_slow_filter @@ -77,10 +81,10 @@ set session log_slow_filter='filesort,query_cache'; select @@session.log_slow_filter; @@session.log_slow_filter filesort,query_cache -set session log_slow_filter='admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk'; +set session log_slow_filter='admin,not_using_index,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk'; select @@session.log_slow_filter; @@session.log_slow_filter -admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +admin,filesort,filesort_on_disk,full_join,full_scan,not_using_index,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk set session log_slow_filter=''; select @@session.log_slow_filter; @@session.log_slow_filter @@ -91,6 +95,6 @@ set session log_slow_filter=1e1; ERROR 42000: Incorrect argument type to variable 'log_slow_filter' set session log_slow_filter="foo"; ERROR 42000: Variable 'log_slow_filter' can't be set to the value of 'foo' -set session log_slow_filter=1024; -ERROR 42000: Variable 'log_slow_filter' can't be set to the value of '1024' +set session log_slow_filter=16384; +ERROR 42000: Variable 'log_slow_filter' can't be set to the value of '16384' SET @@global.log_slow_filter = @start_global_value; diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result index 7be656b2b05..20ece183b86 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -1703,6 +1703,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME LOG_DISABLED_STATEMENTS +SESSION_VALUE sp +GLOBAL_VALUE sp +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE sp +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT Don't log certain types of statements to general log +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST slave,sp +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_ERROR SESSION_VALUE NULL GLOBAL_VALUE @@ -1732,13 +1746,13 @@ ENUM_VALUE_LIST NONE,FILE,TABLE READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_QUERIES_NOT_USING_INDEXES -SESSION_VALUE NULL +SESSION_VALUE OFF GLOBAL_VALUE OFF GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF -VARIABLE_SCOPE GLOBAL +VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log queries that are executed without benefit of any index to the slow log if it is open +VARIABLE_COMMENT Log queries that are executed without benefit of any index to the slow log if it is open. Same as log_slow_filter='not_using_index' NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1746,31 +1760,45 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME LOG_SLOW_ADMIN_STATEMENTS -SESSION_VALUE NULL +SESSION_VALUE ON GLOBAL_VALUE ON GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON -VARIABLE_SCOPE GLOBAL +VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to the slow log if it is open. +VARIABLE_COMMENT Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to the slow log if it is open. Resets or sets the option 'admin' in log_slow_disabled_statements NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME LOG_SLOW_DISABLED_STATEMENTS +SESSION_VALUE sp +GLOBAL_VALUE sp +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE sp +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT Don't log certain types of statements to slow log +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST admin,call,slave,sp +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_FILTER -SESSION_VALUE admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk -GLOBAL_VALUE admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +SESSION_VALUE admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +GLOBAL_VALUE admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +DEFAULT_VALUE admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk VARIABLE_SCOPE SESSION VARIABLE_TYPE SET -VARIABLE_COMMENT Log only certain types of queries +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 NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +ENUM_VALUE_LIST admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,not_using_index,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_RATE_LIMIT @@ -1788,13 +1816,13 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_SLAVE_STATEMENTS -SESSION_VALUE NULL +SESSION_VALUE ON GLOBAL_VALUE ON GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON -VARIABLE_SCOPE GLOBAL +VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log slow statements executed by slave thread to the slow log if it is open. +VARIABLE_COMMENT Log slow statements executed by slave thread to the slow log if it is open. Resets or sets the option 'slave' in log_slow_disabled_statements NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index a94b4f720c6..0867139f37d 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -1871,6 +1871,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME LOG_DISABLED_STATEMENTS +SESSION_VALUE sp +GLOBAL_VALUE sp +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE sp +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT Don't log certain types of statements to general log +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST slave,sp +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_ERROR SESSION_VALUE NULL GLOBAL_VALUE PATH @@ -1900,13 +1914,13 @@ ENUM_VALUE_LIST NONE,FILE,TABLE READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_QUERIES_NOT_USING_INDEXES -SESSION_VALUE NULL +SESSION_VALUE OFF GLOBAL_VALUE OFF GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE OFF -VARIABLE_SCOPE GLOBAL +VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log queries that are executed without benefit of any index to the slow log if it is open +VARIABLE_COMMENT Log queries that are executed without benefit of any index to the slow log if it is open. Same as log_slow_filter='not_using_index' NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -1928,31 +1942,45 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME LOG_SLOW_ADMIN_STATEMENTS -SESSION_VALUE NULL +SESSION_VALUE ON GLOBAL_VALUE ON GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON -VARIABLE_SCOPE GLOBAL +VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to the slow log if it is open. +VARIABLE_COMMENT Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to the slow log if it is open. Resets or sets the option 'admin' in log_slow_disabled_statements NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME LOG_SLOW_DISABLED_STATEMENTS +SESSION_VALUE sp +GLOBAL_VALUE sp +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE sp +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT Don't log certain types of statements to slow log +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST admin,call,slave,sp +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_FILTER -SESSION_VALUE admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk -GLOBAL_VALUE admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +SESSION_VALUE admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +GLOBAL_VALUE admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +DEFAULT_VALUE admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk VARIABLE_SCOPE SESSION VARIABLE_TYPE SET -VARIABLE_COMMENT Log only certain types of queries +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 NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +ENUM_VALUE_LIST admin,filesort,filesort_on_disk,filsort_priority_queue,full_join,full_scan,not_using_index,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_RATE_LIMIT @@ -1970,13 +1998,13 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_SLAVE_STATEMENTS -SESSION_VALUE NULL +SESSION_VALUE ON GLOBAL_VALUE ON GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE ON -VARIABLE_SCOPE GLOBAL +VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Log slow statements executed by slave thread to the slow log if it is open. +VARIABLE_COMMENT Log slow statements executed by slave thread to the slow log if it is open. Resets or sets the option 'slave' in log_slow_disabled_statements NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL diff --git a/mysql-test/suite/sys_vars/t/log_disabled_statements_basic.test b/mysql-test/suite/sys_vars/t/log_disabled_statements_basic.test new file mode 100644 index 00000000000..f6191629f91 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_disabled_statements_basic.test @@ -0,0 +1,51 @@ +# set session + +SET @start_global_value = @@global.log_disabled_statements; + +# +# exists as global only +# +select @@global.log_disabled_statements; +select @@session.log_disabled_statements; +show global variables like 'log_disabled_statements'; +show session variables like 'log_disabled_statements'; +select * from information_schema.global_variables where variable_name='log_disabled_statements'; +select * from information_schema.session_variables where variable_name='log_disabled_statements'; + +# +# show that it's writable +# +set global log_disabled_statements=1; +select @@global.log_disabled_statements; +set session log_disabled_statements=1; +select @@session.log_disabled_statements; + +# +# all valid values +# +set session log_disabled_statements=1; +select @@session.log_disabled_statements; +set session log_disabled_statements=2; +select @@session.log_disabled_statements; +set session log_disabled_statements='slave'; +select @@session.log_disabled_statements; +set session log_disabled_statements='sp'; +select @@session.log_disabled_statements; +set session log_disabled_statements='slave,sp'; +select @@session.log_disabled_statements; +set session log_disabled_statements=''; +select @@session.log_disabled_statements; + +# +# incorrect types/values +# +--error ER_WRONG_TYPE_FOR_VAR +set session log_disabled_statements=1.1; +--error ER_WRONG_TYPE_FOR_VAR +set session log_disabled_statements=1e1; +--error ER_WRONG_VALUE_FOR_VAR +set session log_disabled_statements="foo"; +--error ER_WRONG_VALUE_FOR_VAR +set session log_disabled_statements=1024; + +SET @@global.log_disabled_statements = @start_global_value; diff --git a/mysql-test/suite/sys_vars/t/log_disabled_statements_func-master.opt b/mysql-test/suite/sys_vars/t/log_disabled_statements_func-master.opt new file mode 100644 index 00000000000..c9f62c1ab8a --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_disabled_statements_func-master.opt @@ -0,0 +1,2 @@ +--general-log +--general-log-file=test.log diff --git a/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test b/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test new file mode 100644 index 00000000000..a7a088cdcd9 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test @@ -0,0 +1,61 @@ +SET @old_log_output= @@global.log_output; +SET @old_log_disable_statements= @@global.log_disabled_statements; + + +CREATE TABLE t1 (i INT PRIMARY KEY AUTO_INCREMENT, j VARCHAR(255) ) ENGINE=MyISAM; +insert into t1 (j) values ('a'),('b'),('c'),('d'); + +# enable slow logging to table +SET GLOBAL log_output = 'file,table'; + +DELIMITER $; +CREATE PROCEDURE slow() +BEGIN + SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b'; + SELECT count(*) from t1 where j>'a'; +END +$ + +DELIMITER ;$ + +select @@log_disabled_statements; +TRUNCATE TABLE mysql.general_log; +check table t1; +CALL slow(); +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2'; + +--echo --> +SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; +--echo <-- + +TRUNCATE TABLE mysql.general_log; +SET SESSION log_disabled_statements=""; +check table t1; +CALL slow(); +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3'; + +--echo --> +SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; +--echo <-- + +TRUNCATE TABLE mysql.general_log; +SET SESSION log_disabled_statements="sp,slave"; +check table t1; +CALL slow(); +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4'; + +--echo --> +SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; +--echo <-- + +DROP TABLE t1; +DROP PROCEDURE slow; + +# +# Restore setup +# +TRUNCATE TABLE mysql.general_log; +SET @@global.log_output= @old_log_output; +SET @@global.log_disabled_statements= @old_log_disable_statements; + + diff --git a/mysql-test/suite/sys_vars/t/log_queries_not_using_indexes_basic.test b/mysql-test/suite/sys_vars/t/log_queries_not_using_indexes_basic.test index a726bff08d7..5710920464f 100644 --- a/mysql-test/suite/sys_vars/t/log_queries_not_using_indexes_basic.test +++ b/mysql-test/suite/sys_vars/t/log_queries_not_using_indexes_basic.test @@ -21,6 +21,16 @@ ############################################################################### SET @start_value= @@global.log_queries_not_using_indexes; +SET @filter_start_value= @@global.log_slow_filter; + +#################################################################### +# Check that variable is both session and global # +#################################################################### + +SET @@global.log_queries_not_using_indexes= TRUE; +SET @@session.log_queries_not_using_indexes= TRUE; +SET @@global.log_queries_not_using_indexes= FALSE; +SET @@session.log_queries_not_using_indexes= FALSE; #################################################################### # Valid values for boolean # @@ -63,7 +73,7 @@ SET GLOBAL log_queries_not_using_indexes= +0; SELECT @@global.log_queries_not_using_indexes; ################################################################# -# Check if the value in GLOBAL Table matches value in variable # +# Not valid values for the variable # ################################################################# --error ER_WRONG_VALUE_FOR_VAR @@ -88,23 +98,38 @@ SET @@global.log_queries_not_using_indexes= @badvar; --error ER_WRONG_VALUE_FOR_VAR SET GLOBAL log_queries_not_using_indexes= 'DEFAULT'; ---error ER_GLOBAL_VARIABLE -SET log_queries_not_using_indexes= TRUE; - ---error ER_GLOBAL_VARIABLE -SET SESSION log_queries_not_using_indexes= TRUE; - ---error ER_GLOBAL_VARIABLE -SET @@session.log_queries_not_using_indexes= TRUE; - ---error ER_GLOBAL_VARIABLE -SET LOCAL log_queries_not_using_indexes= TRUE; - --error ER_PARSE_ERROR SET @@global log_queries_not_using_indexes= TRUE; --error ER_PARSE_ERROR SET @@SESSION log_queries_not_using_indexes= TRUE; -SET @@global.log_queries_not_using_indexes= @start_value; +#################################################################### +# Ensure that the value matches log_slow_filter # +#################################################################### + +SET @@SESSION.log_queries_not_using_indexes= TRUE; +select @@SESSION.log_slow_filter; +SET @@SESSION.log_queries_not_using_indexes= FALSE; +select @@SESSION.log_slow_filter; +SET @@GLOBAL.log_queries_not_using_indexes= TRUE; +select @@GLOBAL.log_slow_filter; +SET @@GLOBAL.log_queries_not_using_indexes= FALSE; +select @@GLOBAL.log_slow_filter; + +SET @@SESSION.log_slow_filter=""; +select @@SESSION.log_queries_not_using_indexes; +SET @@SESSION.log_slow_filter="not_using_index"; +select @@SESSION.log_queries_not_using_indexes; + +SET @@GLOBAL.log_slow_filter=""; +select @@GLOBAL.log_queries_not_using_indexes; +SET @@GLOBAL.log_slow_filter="not_using_index"; +select @@GLOBAL.log_queries_not_using_indexes; +#################################################################### +# Restore original value # +#################################################################### + +SET @@global.log_queries_not_using_indexes= @start_value; +SET @@global.log_slow_filter= @filter_start_value; diff --git a/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test b/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test index 78e4d35f69a..97822a0f23a 100644 --- a/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test +++ b/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test @@ -16,7 +16,7 @@ CREATE TABLE log_slow_admin_statements ( SET GLOBAL log_output = 'file,table'; SET GLOBAL slow_query_log = on; SET SESSION long_query_time = 0; -SET GLOBAL log_slow_admin_statements = on; +SET SESSION log_slow_admin_statements = on; # test ALTER, OPTIMIZE and CHECK against the table shown up ALTER TABLE log_slow_admin_statements ADD COLUMN k INT DEFAULT 17; @@ -59,3 +59,30 @@ SET @@global.log_slow_admin_statements= @old_log_slow_admin_statements; DROP PROCEDURE add_rows; TRUNCATE TABLE mysql.slow_log; + +# +# Ensure that log_slow_admin_statements maps to log_slow_disable_statements +# + +SET @save_log_slow_disabled_statements= @@global.log_slow_disabled_statements; +SET @@SESSION.log_slow_admin_statements= TRUE; +select @@SESSION.log_slow_disabled_statements; +SET @@SESSION.log_slow_admin_statements= FALSE; +select @@SESSION.log_slow_disabled_statements; +SET @@GLOBAL.log_slow_admin_statements= TRUE; +select @@GLOBAL.log_slow_disabled_statements; +SET @@GLOBAL.log_slow_admin_statements= FALSE; +select @@GLOBAL.log_slow_disabled_statements; + +SET @@SESSION.log_slow_disabled_statements=""; +select @@SESSION.log_slow_admin_statements; +SET @@SESSION.log_slow_disabled_statements="admin"; +select @@SESSION.log_slow_admin_statements; + +SET @@GLOBAL.log_slow_disabled_statements=""; +select @@GLOBAL.log_slow_admin_statements; +SET @@GLOBAL.log_slow_disabled_statements="admin"; +select @@GLOBAL.log_slow_admin_statements; + +SET @@global.log_slow_disabled_statements= @save_log_slow_disabled_statements; + diff --git a/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_basic.test b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_basic.test new file mode 100644 index 00000000000..77391df6b3c --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_basic.test @@ -0,0 +1,57 @@ +# set session + +SET @start_global_value = @@global.log_slow_disabled_statements; + +# +# exists as global only +# +select @@global.log_slow_disabled_statements; +select @@session.log_slow_disabled_statements; +show global variables like 'log_slow_disabled_statements'; +show session variables like 'log_slow_disabled_statements'; +select * from information_schema.global_variables where variable_name='log_slow_disabled_statements'; +select * from information_schema.session_variables where variable_name='log_slow_disabled_statements'; + +# +# show that it's writable +# +set global log_slow_disabled_statements=1; +select @@global.log_slow_disabled_statements; +set session log_slow_disabled_statements=1; +select @@session.log_slow_disabled_statements; + +# +# all valid values +# +set session log_slow_disabled_statements=1; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements=2; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements=5; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements='admin'; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements='slave'; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements='call'; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements='sp'; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements='admin,sp,call,slave'; +select @@session.log_slow_disabled_statements; +set session log_slow_disabled_statements=''; +select @@session.log_slow_disabled_statements; + +# +# incorrect types/values +# +--error ER_WRONG_TYPE_FOR_VAR +set session log_slow_disabled_statements=1.1; +--error ER_WRONG_TYPE_FOR_VAR +set session log_slow_disabled_statements=1e1; +--error ER_WRONG_VALUE_FOR_VAR +set session log_slow_disabled_statements="foo"; +--error ER_WRONG_VALUE_FOR_VAR +set session log_slow_disabled_statements=1024; + +SET @@global.log_slow_disabled_statements = @start_global_value; diff --git a/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test new file mode 100644 index 00000000000..483948c840e --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test @@ -0,0 +1,92 @@ +SET @old_log_output= @@global.log_output; +SET @old_slow_query_log= @@global.slow_query_log; +SET @old_long_query_time= @@session.long_query_time; +SET @old_log_slow_disable_statements= @@global.log_slow_disabled_statements; + +# Log everything to slow log +SET @@session.log_slow_verbosity="explain,innodb,query_plan"; + +CREATE TABLE t1 (i INT PRIMARY KEY AUTO_INCREMENT, j blob) ENGINE=MyISAM; +insert into t1 (j) values ('a'),('b'),('c'),('d'); +create table t2 (a int auto_increment primary key) engine=myisam; + +# enable slow logging to table +SET GLOBAL log_output = 'file,table'; +SET GLOBAL slow_query_log = on; + +DELIMITER $; +CREATE PROCEDURE slow() +BEGIN + SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b'; + SELECT count(*) from t1 where j>'a'; + insert into t2 () values(); +END +$ + +CREATE PROCEDURE slow2() +BEGIN + SELECT j,count(*) from t1 group by j; + create temporary table t3 (a int); + alter table t3 add column (b int); + call slow(); + drop temporary table t3; + SELECT j,count(*)+1 from t1 group by j,i; +END +$ + +DELIMITER ;$ + +SET SESSION long_query_time = 0; + +SELECT @@log_slow_disabled_statements; +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra int; +CALL slow2(); +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2'; + +--echo --> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +--echo <-- + +SET SESSION log_slow_disabled_statements="call,admin"; +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra2 int; +CALL slow2(); +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3'; + +--echo --> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +--echo <-- + +SET SESSION log_slow_disabled_statements=""; +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra3 int; +CALL slow2(); +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4'; + +--echo --> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +--echo <-- + +SET SESSION log_slow_disabled_statements="call,admin,slave,sp"; +TRUNCATE TABLE mysql.slow_log; +ALTER TABLE t1 add column extra4 int; +CALL slow2(); +SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part5'; + +--echo --> +SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; +--echo <-- + +DROP TABLE t1,t2; +DROP PROCEDURE slow; +DROP PROCEDURE slow2; + +# +# Restore setup +# +SET @@session.long_query_time= @old_long_query_time; +TRUNCATE TABLE mysql.slow_log; +SET @@global.log_output= @old_log_output; +SET @@global.slow_query_log= @old_slow_query_log; +SET @@global.log_slow_disabled_statements= @old_log_slow_disable_statements; diff --git a/mysql-test/suite/sys_vars/t/log_slow_filter_basic.test b/mysql-test/suite/sys_vars/t/log_slow_filter_basic.test index 2891b7ded8b..5309456b3ef 100644 --- a/mysql-test/suite/sys_vars/t/log_slow_filter_basic.test +++ b/mysql-test/suite/sys_vars/t/log_slow_filter_basic.test @@ -39,6 +39,8 @@ set session log_slow_filter='full_join'; select @@session.log_slow_filter; set session log_slow_filter='full_scan'; select @@session.log_slow_filter; +set session log_slow_filter='not_using_index'; +select @@session.log_slow_filter; set session log_slow_filter='query_cache'; select @@session.log_slow_filter; set session log_slow_filter='query_cache_miss'; @@ -49,7 +51,7 @@ set session log_slow_filter='tmp_table_on_disk'; select @@session.log_slow_filter; set session log_slow_filter='filesort,query_cache'; select @@session.log_slow_filter; -set session log_slow_filter='admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk'; +set session log_slow_filter='admin,not_using_index,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk'; select @@session.log_slow_filter; set session log_slow_filter=''; select @@session.log_slow_filter; @@ -64,6 +66,6 @@ set session log_slow_filter=1e1; --error ER_WRONG_VALUE_FOR_VAR set session log_slow_filter="foo"; --error ER_WRONG_VALUE_FOR_VAR -set session log_slow_filter=1024; +set session log_slow_filter=16384; SET @@global.log_slow_filter = @start_global_value; diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index 13ca9a528c6..262013e0d2c 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -954,11 +954,11 @@ flush status; show variables like "log_queries_not_using_indexes"; select 1 from information_schema.tables limit 1; show status like 'slow_queries'; -set global log_queries_not_using_indexes=OFF; +set session log_queries_not_using_indexes=OFF; show variables like "log_queries_not_using_indexes"; select 1 from information_schema.tables limit 1; show status like 'slow_queries'; -set global log_queries_not_using_indexes=ON; +set session log_queries_not_using_indexes=ON; show variables like "log_queries_not_using_indexes"; select 1 from information_schema.tables limit 1; show status like 'slow_queries'; diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 57b28d1fd8a..8eff81393d4 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -835,7 +835,27 @@ static int setval(const struct my_option *opts, void *value, char *argument, goto ret; }; } + case GET_BIT: + { + uint tmp; + ulonglong bit= (opts->block_size >= 0 ? + opts->block_size : + -opts->block_size); + /* + This sets a bit stored in a longlong. + The bit to set is stored in block_size. If block_size is positive + then setting the bit means value is true. If block_size is negatitive, + then setting the bit means value is false. + */ + tmp= get_bool_argument(opts, argument); + if (opts->block_size < 0) + tmp= !tmp; + if (tmp) + (*(ulonglong*)value)|= bit; + else + (*(ulonglong*)value)&= ~bit; break; + } case GET_NO_ARG: /* get_one_option has taken care of the value already */ default: /* dummy default to avoid compiler warnings */ break; @@ -1289,6 +1309,19 @@ static void init_one_value(const struct my_option *option, void *variable, case GET_FLAGSET: *((ulonglong*) variable)= (ulonglong) value; break; + case GET_BIT: + { + ulonglong bit= (option->block_size >= 0 ? + option->block_size : + -option->block_size); + if (option->block_size < 0) + value= !value; + if (value) + (*(ulonglong*)variable)|= bit; + else + (*(ulonglong*)variable)&= ~bit; + break; + } case GET_DOUBLE: *((double*) variable)= getopt_ulonglong2double(value); break; @@ -1477,7 +1510,8 @@ void my_print_help(const struct my_option *options) printf("--"); col+= 2 + print_name(optp); if (optp->arg_type == NO_ARG || - (optp->var_type & GET_TYPE_MASK) == GET_BOOL) + (optp->var_type & GET_TYPE_MASK) == GET_BOOL || + (optp->var_type & GET_TYPE_MASK) == GET_BIT) { putchar(' '); col++; @@ -1627,6 +1661,16 @@ void my_print_variables(const struct my_option *options) case GET_BOOL: printf("%s\n", *((my_bool*) value) ? "TRUE" : "FALSE"); break; + case GET_BIT: + { + ulonglong bit= (optp->block_size >= 0 ? + optp->block_size : + -optp->block_size); + my_bool reverse= optp->block_size < 0; + printf("%s\n", ((*((ulonglong*) value) & bit) != 0) ^ reverse ? + "TRUE" : "FALSE"); + break; + } case GET_INT: printf("%d\n", *((int*) value)); break; diff --git a/sql/filesort.cc b/sql/filesort.cc index 8c0b0010b75..04431a2bccc 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -37,7 +37,6 @@ #include "bounded_queue.h" #include "filesort_utils.h" #include "sql_select.h" -#include "log_slow.h" #include "debug_sync.h" /// How to write record_ref. diff --git a/sql/log.cc b/sql/log.cc index deba614d096..0afa6662a9a 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -39,11 +39,9 @@ #include "rpl_filter.h" #include "rpl_rli.h" #include "sql_audit.h" -#include "log_slow.h" #include "mysqld.h" #include <my_dir.h> -#include <stdarg.h> #include <m_ctype.h> // For test_if_number #ifdef _WIN32 @@ -56,6 +54,8 @@ #include "sql_show.h" #include "my_pthread.h" #include "wsrep_mysqld.h" +#include "sp_rcontext.h" +#include "sp_head.h" /* max size of the log message */ #define MAX_LOG_BUFFER_SIZE 1024 @@ -2976,6 +2976,7 @@ bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time, const char *sql_text, uint sql_text_len) { bool error= 0; + char llbuff[22]; DBUG_ENTER("MYSQL_QUERY_LOG::write"); mysql_mutex_lock(&LOCK_log); @@ -3018,22 +3019,39 @@ bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time, sprintf(query_time_buff, "%.6f", ulonglong2double(query_utime)/1000000.0); sprintf(lock_time_buff, "%.6f", ulonglong2double(lock_utime)/1000000.0); if (my_b_printf(&log_file, - "# Thread_id: %lu Schema: %s QC_hit: %s\n" \ - "# Query_time: %s Lock_time: %s Rows_sent: %lu Rows_examined: %lu\n" \ - "# Rows_affected: %lu\n", + "# Thread_id: %lu Schema: %s QC_hit: %s\n" + "# Query_time: %s Lock_time: %s Rows_sent: %lu Rows_examined: %lu\n" + "# Rows_affected: %lu Bytes_sent: %lu\n", (ulong) thd->thread_id, (thd->db ? thd->db : ""), ((thd->query_plan_flags & QPLAN_QC) ? "Yes" : "No"), query_time_buff, lock_time_buff, (ulong) thd->get_sent_row_count(), (ulong) thd->get_examined_row_count(), - thd->get_stmt_da()->is_ok() ? - (ulong) thd->get_stmt_da()->affected_rows() : - 0) == (size_t) -1) + (ulong) thd->get_affected_rows(), + (ulong) (thd->status_var.bytes_sent - thd->bytes_sent_old)) + == (size_t) -1) tmp_errno= errno; + + if ((thd->variables.log_slow_verbosity & LOG_SLOW_VERBOSITY_QUERY_PLAN) + && thd->tmp_tables_used && + my_b_printf(&log_file, + "# Tmp_tables: %lu Tmp_disk_tables: %lu " + "Tmp_table_sizes: %s\n", + (ulong) thd->tmp_tables_used, + (ulong) thd->tmp_tables_disk_used, + llstr(thd->tmp_tables_size, llbuff)) == (uint) -1) + tmp_errno= errno; + + if (thd->spcont) + if (my_b_printf(&log_file, "# Stored_routine: %s\n", + ErrConvDQName(thd->spcont->sp).ptr()) == (uint) -1) + tmp_errno= errno; + if ((thd->variables.log_slow_verbosity & LOG_SLOW_VERBOSITY_QUERY_PLAN) && (thd->query_plan_flags & (QPLAN_FULL_SCAN | QPLAN_FULL_JOIN | QPLAN_TMP_TABLE | - QPLAN_TMP_DISK | QPLAN_FILESORT | QPLAN_FILESORT_DISK)) && + QPLAN_TMP_DISK | QPLAN_FILESORT | QPLAN_FILESORT_DISK | + QPLAN_FILESORT_PRIORITY_QUEUE)) && my_b_printf(&log_file, "# Full_scan: %s Full_join: %s " "Tmp_table: %s Tmp_table_on_disk: %s\n" @@ -3041,8 +3059,8 @@ bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time, "Priority_queue: %s\n", ((thd->query_plan_flags & QPLAN_FULL_SCAN) ? "Yes" : "No"), ((thd->query_plan_flags & QPLAN_FULL_JOIN) ? "Yes" : "No"), - ((thd->query_plan_flags & QPLAN_TMP_TABLE) ? "Yes" : "No"), - ((thd->query_plan_flags & QPLAN_TMP_DISK) ? "Yes" : "No"), + (thd->tmp_tables_used ? "Yes" : "No"), + (thd->tmp_tables_disk_used ? "Yes" : "No"), ((thd->query_plan_flags & QPLAN_FILESORT) ? "Yes" : "No"), ((thd->query_plan_flags & QPLAN_FILESORT_DISK) ? "Yes" : "No"), @@ -6427,31 +6445,29 @@ bool slow_log_print(THD *thd, const char *query, uint query_length, } +/** + Decide if we should log the command to general log + + @retval + FALSE No logging + TRUE Ok to log +*/ + bool LOGGER::log_command(THD *thd, enum enum_server_command command) { -#ifndef NO_EMBEDDED_ACCESS_CHECKS - Security_context *sctx= thd->security_ctx; -#endif /* Log command if we have at least one log event handler enabled and want to log this king of commands */ - if (*general_log_handler_list && (what_to_log & (1L << (uint) command))) - { - if ((thd->variables.option_bits & OPTION_LOG_OFF) -#ifndef NO_EMBEDDED_ACCESS_CHECKS - && (sctx->master_access & SUPER_ACL) -#endif - ) - { - /* No logging */ - return FALSE; - } - - return TRUE; - } + if (!(*general_log_handler_list && (what_to_log & (1L << (uint) command)))) + return FALSE; - return FALSE; + /* + If LOG_SLOW_DISABLE_SLAVE is set when slave thread starts, then + OPTION_LOG_OFF is set. + Only the super user can set this bit. + */ + return !(thd->variables.option_bits & OPTION_LOG_OFF); } @@ -6461,7 +6477,7 @@ bool general_log_print(THD *thd, enum enum_server_command command, va_list args; uint error= 0; - /* Print the message to the buffer if we want to log this king of commands */ + /* Print the message to the buffer if we want to log this kind of commands */ if (! logger.log_command(thd, command)) return FALSE; diff --git a/sql/log_event.cc b/sql/log_event.cc index abfa0b80ed5..9b2e732d413 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -5253,13 +5253,13 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, if (thd->slave_thread) { /* - The opt_log_slow_slave_statements variable can be changed - dynamically, so we have to set the sql_log_slow respectively. + To be compatible with previous releases, the slave thread uses the global + log_slow_disabled_statements value, wich can be changed dynamically, so we + have to set the sql_log_slow respectively. */ - thd->variables.sql_log_slow= opt_log_slow_slave_statements; + thd->variables.sql_log_slow= !MY_TEST(global_system_variables.log_slow_disabled_statements & LOG_SLOW_DISABLE_SLAVE); } - thd->enable_slow_log= thd->variables.sql_log_slow; mysql_parse(thd, thd->query(), thd->query_length(), &parser_state, FALSE, FALSE); /* Finalize server status flags after executing a statement. */ diff --git a/sql/log_slow.h b/sql/log_slow.h index c52722f0cd7..069c35173b9 100644 --- a/sql/log_slow.h +++ b/sql/log_slow.h @@ -15,6 +15,9 @@ /* Defining what to log to slow log */ +#ifndef LOG_SLOW_INCLUDED +#define LOG_SLOW_INCLUDED + #define LOG_SLOW_VERBOSITY_INIT 0 #define LOG_SLOW_VERBOSITY_INNODB (1U << 0) #define LOG_SLOW_VERBOSITY_QUERY_PLAN (1U << 1) @@ -25,13 +28,26 @@ #define QPLAN_ADMIN (1U << 0) #define QPLAN_FILESORT (1U << 1) #define QPLAN_FILESORT_DISK (1U << 2) -#define QPLAN_FULL_JOIN (1U << 3) -#define QPLAN_FULL_SCAN (1U << 4) -#define QPLAN_QC (1U << 5) -#define QPLAN_QC_NO (1U << 6) -#define QPLAN_TMP_DISK (1U << 7) -#define QPLAN_TMP_TABLE (1U << 8) -#define QPLAN_FILESORT_PRIORITY_QUEUE (1U << 9) +#define QPLAN_FILESORT_PRIORITY_QUEUE (1U << 3) +#define QPLAN_FULL_JOIN (1U << 4) +#define QPLAN_FULL_SCAN (1U << 5) +#define QPLAN_NOT_USING_INDEX (1U << 6) +#define QPLAN_QC (1U << 7) +#define QPLAN_QC_NO (1U << 8) +#define QPLAN_TMP_TABLE (1U << 9) +#define QPLAN_TMP_DISK (1U << 10) /* ... */ #define QPLAN_MAX (1UL << 31) /* reserved as placeholder */ + +/* Bits for log_slow_disabled_statements */ +#define LOG_SLOW_DISABLE_ADMIN (1 << 0) +#define LOG_SLOW_DISABLE_CALL (1 << 1) +#define LOG_SLOW_DISABLE_SLAVE (1 << 2) +#define LOG_SLOW_DISABLE_SP (1 << 3) + +/* Bits for log_disabled_statements */ +#define LOG_DISABLE_SLAVE (1 << 0) +#define LOG_DISABLE_SP (1 << 1) + +#endif /* LOG_SLOW_INCLUDED */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 2ef2830e80b..bd34a3fec93 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -396,7 +396,6 @@ my_bool disable_log_notes, opt_support_flashback= 0; static my_bool opt_abort; ulonglong log_output_options; my_bool opt_userstat_running; -my_bool opt_log_queries_not_using_indexes= 0; bool opt_error_log= IF_WIN(1,0); bool opt_disable_networking=0, opt_skip_show_db=0; bool opt_skip_name_resolve=0; @@ -458,8 +457,6 @@ my_bool relay_log_recovery; my_bool opt_sync_frm, opt_allow_suspicious_udfs; my_bool opt_secure_auth= 0; char* opt_secure_file_priv; -my_bool opt_log_slow_admin_statements= 0; -my_bool opt_log_slow_slave_statements= 0; my_bool lower_case_file_system= 0; my_bool opt_large_pages= 0; my_bool opt_super_large_pages= 0; diff --git a/sql/mysqld.h b/sql/mysqld.h index ceefcd2f576..d753eceaa59 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -116,7 +116,6 @@ extern my_bool opt_backup_progress_log; extern my_bool opt_support_flashback; extern ulonglong log_output_options; extern ulong log_backup_output_options; -extern my_bool opt_log_queries_not_using_indexes; extern bool opt_disable_networking, opt_skip_show_db; extern bool opt_skip_name_resolve; extern bool opt_ignore_builtin_innodb; @@ -143,7 +142,6 @@ extern const char *current_dbug_option; extern char* opt_secure_file_priv; extern char* opt_secure_backup_file_priv; extern size_t opt_secure_backup_file_priv_len; -extern my_bool opt_log_slow_admin_statements, opt_log_slow_slave_statements; extern my_bool sp_automatic_privileges, opt_noacl; extern ulong use_stat_tables; extern my_bool opt_old_style_user_limits, trust_function_creators; diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index b274824a33b..0570b50565e 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -1008,8 +1008,7 @@ handle_rpl_parallel_thread(void *arg) thd->security_ctx->skip_grants(); thd->variables.max_allowed_packet= slave_max_allowed_packet; thd->slave_thread= 1; - thd->variables.sql_log_slow= opt_log_slow_slave_statements; - thd->variables.log_slow_filter= global_system_variables.log_slow_filter; + set_slave_thread_options(thd); thd->client_capabilities = CLIENT_LOCAL_FILES; thd->net.reading_or_writing= 0; diff --git a/sql/set_var.cc b/sql/set_var.cc index 474bfe683a6..606f9ac511d 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -1162,6 +1162,7 @@ int fill_sysvars(THD *thd, TABLE_LIST *tables, COND *cond) { STRING_WITH_LEN("SET") }, // GET_SET 13 { STRING_WITH_LEN("DOUBLE") }, // GET_DOUBLE 14 { STRING_WITH_LEN("FLAGSET") }, // GET_FLAGSET 15 + { STRING_WITH_LEN("BOOLEAN") }, // GET_BIT 16 }; const ulong vartype= (var->option.var_type & GET_TYPE_MASK); const LEX_CSTRING *type= types + vartype; diff --git a/sql/set_var.h b/sql/set_var.h index 8d39854a744..d0143e1e524 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -158,6 +158,7 @@ public: case GET_BOOL: case GET_SET: case GET_FLAGSET: + case GET_BIT: return type != STRING_RESULT && type != INT_RESULT; case GET_DOUBLE: return type != INT_RESULT && type != REAL_RESULT && type != DECIMAL_RESULT; diff --git a/sql/slave.cc b/sql/slave.cc index a48acc13102..fea57a95bee 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3378,6 +3378,13 @@ void set_slave_thread_options(THD* thd) options&= ~OPTION_BIN_LOG; thd->variables.option_bits= options; thd->variables.completion_type= 0; + + /* For easier test in LOGGER::log_command */ + if (thd->variables.log_disabled_statements & LOG_DISABLE_SLAVE) + thd->variables.option_bits|= OPTION_LOG_OFF; + + thd->variables.sql_log_slow= !MY_TEST(thd->variables.log_slow_disabled_statements & + LOG_SLOW_DISABLE_SLAVE); DBUG_VOID_RETURN; } @@ -3424,8 +3431,7 @@ static int init_slave_thread(THD* thd, Master_info *mi, thd->security_ctx->skip_grants(); thd->slave_thread= 1; thd->connection_name= mi->connection_name; - thd->variables.sql_log_slow= opt_log_slow_slave_statements; - thd->variables.log_slow_filter= global_system_variables.log_slow_filter; + thd->variables.sql_log_slow= !MY_TEST(thd->variables.log_slow_disabled_statements & LOG_SLOW_DISABLE_SLAVE); set_slave_thread_options(thd); thd->client_capabilities = CLIENT_LOCAL_FILES; diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 8865a18749a..c1a194ab9b9 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1561,9 +1561,8 @@ sp_head::execute_trigger(THD *thd, goto err_with_cleanup; } -#ifdef DBUG_ASSERT_EXISTS + /* Needed by slow log */ nctx->sp= this; -#endif thd->spcont= nctx; @@ -1685,9 +1684,8 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, */ thd->restore_active_arena(&call_arena, &backup_arena); -#ifdef DBUG_ASSERT_EXISTS + /* Needed by slow log */ nctx->sp= this; -#endif /* Pass arguments. */ for (arg_no= 0; arg_no < argcount; arg_no++) @@ -1891,9 +1889,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) DBUG_RETURN(TRUE); } -#ifdef DBUG_ASSERT_EXISTS octx->sp= 0; -#endif thd->spcont= octx; /* set callers_arena to thd, for upper-level function to work */ @@ -1906,9 +1902,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) thd->spcont= save_spcont; DBUG_RETURN(TRUE); } -#ifdef DBUG_ASSERT_EXISTS nctx->sp= this; -#endif if (params > 0) { @@ -2005,13 +1999,32 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) DBUG_PRINT("info",(" %.*s: eval args done", (int) m_name.length, m_name.str)); } + save_enable_slow_log= thd->enable_slow_log; - if (!(m_flags & LOG_SLOW_STATEMENTS) && save_enable_slow_log) + + /* + Disable slow log if: + - Slow logging is enabled (no change needed) + - This is a normal SP (not event log) + - If we have not explicitely disabled logging of SP + */ + if (save_enable_slow_log && + ((!(m_flags & LOG_SLOW_STATEMENTS) && + (thd->variables.log_slow_disabled_statements & LOG_SLOW_DISABLE_SP)))) { DBUG_PRINT("info", ("Disabling slow log for the execution")); thd->enable_slow_log= FALSE; } - if (!(m_flags & LOG_GENERAL_LOG) && !(thd->variables.option_bits & OPTION_LOG_OFF)) + + /* + Disable general log if: + - If general log is enabled (no change needed) + - This is a normal SP (not event log) + - If we have not explicitely disabled logging of SP + */ + if (!(thd->variables.option_bits & OPTION_LOG_OFF) && + (!(m_flags & LOG_GENERAL_LOG) && + (thd->variables.log_disabled_statements & LOG_DISABLE_SP))) { DBUG_PRINT("info", ("Disabling general log for the execution")); save_log_general= true; @@ -2035,6 +2048,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) if (save_log_general) thd->variables.option_bits &= ~OPTION_LOG_OFF; thd->enable_slow_log= save_enable_slow_log; + /* In the case when we weren't able to employ reuse mechanism for OUT/INOUT paranmeters, we should reallocate memory. This @@ -3196,14 +3210,29 @@ int sp_instr_stmt::execute(THD *thd, uint *nextp) { int res; + bool save_enable_slow_log; + const CSET_STRING query_backup= thd->query_string; + QUERY_START_TIME_INFO time_info; + Sub_statement_state backup_state; DBUG_ENTER("sp_instr_stmt::execute"); DBUG_PRINT("info", ("command: %d", m_lex_keeper.sql_command())); - const CSET_STRING query_backup= thd->query_string; #if defined(ENABLED_PROFILING) /* This s-p instr is profilable and will be captured. */ thd->profiling.set_query_source(m_query.str, m_query.length); #endif + + if ((save_enable_slow_log= thd->enable_slow_log)) + { + /* + Save start time info for the CALL statement and overwrite it with the + current time for log_slow_statement() to log the individual query timing. + */ + thd->get_time(&time_info); + thd->set_time(); + } + thd->store_slow_query_state(&backup_state); + if (!(res= alloc_query(thd, m_query.str, m_query.length)) && !(res=subst_spvars(thd, this, &m_query))) { @@ -3216,6 +3245,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) if (query_cache_send_result_to_client(thd, thd->query(), thd->query_length()) <= 0) { + thd->reset_slow_query_state(); res= m_lex_keeper.reset_lex_and_exec_core(thd, nextp, FALSE, this); bool log_slow= !res && thd->enable_slow_log; @@ -3235,6 +3265,15 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) if (log_slow) log_slow_statement(thd); + + /* + Restore enable_slow_log, that can be changed by a admin or call + command + */ + thd->enable_slow_log= save_enable_slow_log; + + /* Add the number of rows to thd for the 'call' statistics */ + thd->add_slow_query_state(&backup_state); } else { @@ -3255,6 +3294,10 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) thd->get_stmt_da()->reset_diagnostics_area(); } } + /* Restore the original query start time */ + if (thd->enable_slow_log) + thd->set_time(&time_info); + DBUG_RETURN(res || thd->is_error()); } diff --git a/sql/sp_rcontext.h b/sql/sp_rcontext.h index 6ff6e02f737..c4c80ac5a1f 100644 --- a/sql/sp_rcontext.h +++ b/sql/sp_rcontext.h @@ -176,11 +176,9 @@ public: /// of the client/server protocol. bool end_partial_result_set; -#ifdef DBUG_ASSERT_EXISTS /// The stored program for which this runtime context is created. Used for /// checking if correct runtime context is used for variable handling. sp_head *sp; -#endif ///////////////////////////////////////////////////////////////////////// // SP-variables. diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index d052c040d19..ce12b73a9e2 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -449,10 +449,11 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, int compl_result_code; bool need_repair_or_alter= 0; wait_for_commit* suspended_wfc; - DBUG_ENTER("mysql_admin_table"); DBUG_PRINT("enter", ("extra_open_options: %u", extra_open_options)); + thd->prepare_logs_for_admin_command(); + field_list.push_back(item= new (thd->mem_root) Item_empty_string(thd, "Table", NAME_CHAR_LEN * 2), thd->mem_root); @@ -1304,7 +1305,6 @@ bool Sql_cmd_analyze_table::execute(THD *thd) FALSE, UINT_MAX, FALSE)) goto error; WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); - thd->enable_slow_log= opt_log_slow_admin_statements; res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "analyze", lock_type, 1, 0, 0, 0, &handler::ha_analyze, 0); @@ -1335,7 +1335,6 @@ bool Sql_cmd_check_table::execute(THD *thd) if (check_table_access(thd, SELECT_ACL, first_table, TRUE, UINT_MAX, FALSE)) goto error; /* purecov: inspected */ - thd->enable_slow_log= opt_log_slow_admin_statements; res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "check", lock_type, 0, 0, HA_OPEN_FOR_REPAIR, 0, @@ -1360,7 +1359,7 @@ bool Sql_cmd_optimize_table::execute(THD *thd) FALSE, UINT_MAX, FALSE)) goto error; /* purecov: inspected */ WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); - thd->enable_slow_log= opt_log_slow_admin_statements; + res= (specialflag & SPECIAL_NO_NEW_FUNC) ? mysql_recreate_table(thd, first_table, true) : mysql_admin_table(thd, first_table, &m_lex->check_opt, @@ -1392,7 +1391,8 @@ bool Sql_cmd_repair_table::execute(THD *thd) if (check_table_access(thd, SELECT_ACL | INSERT_ACL, first_table, FALSE, UINT_MAX, FALSE)) goto error; /* purecov: inspected */ - thd->enable_slow_log= opt_log_slow_admin_statements; + thd->enable_slow_log&= !MY_TEST(thd->variables.log_slow_disabled_statements & + LOG_SLOW_DISABLE_ADMIN); WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "repair", TL_WRITE, 1, diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index f2f3f7f25d9..3d1e4c0fa65 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -310,7 +310,7 @@ bool Sql_cmd_alter_table::execute(THD *thd) "INDEX DIRECTORY"); create_info.data_file_name= create_info.index_file_name= NULL; - thd->enable_slow_log= opt_log_slow_admin_statements; + thd->prepare_logs_for_admin_command(); #ifdef WITH_WSREP if ((!thd->is_current_stmt_binlog_format_row() || @@ -355,7 +355,7 @@ bool Sql_cmd_discard_import_tablespace::execute(THD *thd) if (check_grant(thd, ALTER_ACL, table_list, false, UINT_MAX, false)) return true; - thd->enable_slow_log= opt_log_slow_admin_statements; + thd->prepare_logs_for_admin_command(); /* Check if we attempt to alter mysql.slow_log or diff --git a/sql/sql_audit.h b/sql/sql_audit.h index 50613e5e439..4979375559b 100644 --- a/sql/sql_audit.h +++ b/sql/sql_audit.h @@ -142,6 +142,7 @@ static inline void mysql_audit_general(THD *thd, uint event_subtype, int error_code, const char *msg) { + DBUG_ENTER("mysql_audit_general"); if (mysql_audit_general_enabled()) { char user_buff[MAX_USER_HOST_SIZE]; @@ -182,6 +183,7 @@ void mysql_audit_general(THD *thd, uint event_subtype, mysql_audit_notify(thd, MYSQL_AUDIT_GENERAL_CLASS, &event); } + DBUG_VOID_RETURN; } static inline diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index b53d6332eb6..1fc1ff8fa3a 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -345,7 +345,6 @@ TODO list: #include "../storage/myisammrg/ha_myisammrg.h" #include "../storage/myisammrg/myrg_def.h" #include "probes_mysql.h" -#include "log_slow.h" #include "transaction.h" #include "strfunc.h" diff --git a/sql/sql_class.cc b/sql/sql_class.cc index d8c6d0db380..1e18326ec20 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -5097,10 +5097,7 @@ void THD::reset_sub_statement_state(Sub_statement_state *backup, backup->count_cuted_fields= count_cuted_fields; backup->in_sub_stmt= in_sub_stmt; backup->enable_slow_log= enable_slow_log; - backup->query_plan_flags= query_plan_flags; backup->limit_found_rows= limit_found_rows; - backup->examined_row_count= m_examined_row_count; - backup->sent_row_count= m_sent_row_count; backup->cuted_fields= cuted_fields; backup->client_capabilities= client_capabilities; backup->savepoints= transaction.savepoints; @@ -5108,6 +5105,7 @@ void THD::reset_sub_statement_state(Sub_statement_state *backup, first_successful_insert_id_in_prev_stmt; backup->first_successful_insert_id_in_cur_stmt= first_successful_insert_id_in_cur_stmt; + store_slow_query_state(backup); if ((!lex->requires_prelocking() || is_update_query(lex->sql_command)) && !is_current_stmt_binlog_format_row()) @@ -5123,14 +5121,12 @@ void THD::reset_sub_statement_state(Sub_statement_state *backup, /* Disable result sets */ client_capabilities &= ~CLIENT_MULTI_RESULTS; in_sub_stmt|= new_state; - m_examined_row_count= 0; - m_sent_row_count= 0; cuted_fields= 0; transaction.savepoints= 0; first_successful_insert_id_in_cur_stmt= 0; + reset_slow_query_state(); } - void THD::restore_sub_statement_state(Sub_statement_state *backup) { DBUG_ENTER("THD::restore_sub_statement_state"); @@ -5165,7 +5161,6 @@ void THD::restore_sub_statement_state(Sub_statement_state *backup) variables.option_bits= backup->option_bits; in_sub_stmt= backup->in_sub_stmt; enable_slow_log= backup->enable_slow_log; - query_plan_flags= backup->query_plan_flags; first_successful_insert_id_in_prev_stmt= backup->first_successful_insert_id_in_prev_stmt; first_successful_insert_id_in_cur_stmt= @@ -5173,6 +5168,10 @@ void THD::restore_sub_statement_state(Sub_statement_state *backup) limit_found_rows= backup->limit_found_rows; set_sent_row_count(backup->sent_row_count); client_capabilities= backup->client_capabilities; + + /* Restore statistic needed for slow log */ + add_slow_query_state(backup); + /* If we've left sub-statement mode, reset the fatal error flag. Otherwise keep the current value, to propagate it up the sub-statement @@ -5197,6 +5196,56 @@ void THD::restore_sub_statement_state(Sub_statement_state *backup) DBUG_VOID_RETURN; } +/* + Store slow query state at start of a stored procedure statment +*/ + +void THD::store_slow_query_state(Sub_statement_state *backup) +{ + backup->affected_rows= affected_rows; + backup->bytes_sent_old= bytes_sent_old; + backup->examined_row_count= m_examined_row_count; + backup->query_plan_flags= query_plan_flags; + backup->query_plan_fsort_passes= query_plan_fsort_passes; + backup->sent_row_count= m_sent_row_count; + backup->tmp_tables_disk_used= tmp_tables_disk_used; + backup->tmp_tables_size= tmp_tables_size; + backup->tmp_tables_used= tmp_tables_used; +} + +/* Reset variables related to slow query log */ + +void THD::reset_slow_query_state() +{ + affected_rows= 0; + bytes_sent_old= status_var.bytes_sent; + m_examined_row_count= 0; + m_sent_row_count= 0; + query_plan_flags= QPLAN_INIT; + query_plan_fsort_passes= 0; + tmp_tables_disk_used= 0; + tmp_tables_size= 0; + tmp_tables_used= 0; +} + +/* + Add back the stored values to the current counters to be able to get + right status for 'call procedure_name' +*/ + +void THD::add_slow_query_state(Sub_statement_state *backup) +{ + affected_rows+= backup->affected_rows; + bytes_sent_old= backup->bytes_sent_old; + m_examined_row_count+= backup->examined_row_count; + m_sent_row_count+= backup->sent_row_count; + query_plan_flags|= backup->query_plan_flags; + query_plan_fsort_passes+= backup->query_plan_fsort_passes; + tmp_tables_disk_used+= backup->tmp_tables_disk_used; + tmp_tables_size+= backup->tmp_tables_size; + tmp_tables_used+= backup->tmp_tables_used; +} + void THD::set_statement(Statement *stmt) { @@ -5231,6 +5280,8 @@ void THD::inc_examined_row_count(ha_rows count) void THD::inc_status_created_tmp_disk_tables() { + tmp_tables_disk_used++; + query_plan_flags|= QPLAN_TMP_DISK; status_var_increment(status_var.created_tmp_disk_tables_); #ifdef HAVE_PSI_STATEMENT_INTERFACE PSI_STATEMENT_CALL(inc_statement_created_tmp_disk_tables)(m_statement_psi, 1); @@ -5239,6 +5290,8 @@ void THD::inc_status_created_tmp_disk_tables() void THD::inc_status_created_tmp_tables() { + tmp_tables_used++; + query_plan_flags|= QPLAN_TMP_TABLE; status_var_increment(status_var.created_tmp_tables_); #ifdef HAVE_PSI_STATEMENT_INTERFACE PSI_STATEMENT_CALL(inc_statement_created_tmp_tables)(m_statement_psi, 1); diff --git a/sql/sql_class.h b/sql/sql_class.h index f5834186a45..46bd2f6a2b7 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -37,6 +37,7 @@ #include "thr_lock.h" /* thr_lock_type, THR_LOCK_DATA, THR_LOCK_INFO */ #include "thr_timer.h" #include "thr_malloc.h" +#include "log_slow.h" /* LOG_SLOW_DISABLE_... */ #include "sql_digest_stream.h" // sql_digest_state @@ -531,6 +532,8 @@ typedef struct system_variables ulonglong join_buff_space_limit; ulonglong log_slow_filter; ulonglong log_slow_verbosity; + ulonglong log_slow_disabled_statements; + ulonglong log_disabled_statements; ulonglong bulk_insert_buff_size; ulonglong join_buff_size; ulonglong sortbuff_size; @@ -1508,19 +1511,25 @@ public: class Sub_statement_state { public: + Discrete_interval auto_inc_interval_for_cur_row; + Discrete_intervals_list auto_inc_intervals_forced; + SAVEPOINT *savepoints; ulonglong option_bits; ulonglong first_successful_insert_id_in_prev_stmt; ulonglong first_successful_insert_id_in_cur_stmt, insert_id_for_cur_row; - Discrete_interval auto_inc_interval_for_cur_row; - Discrete_intervals_list auto_inc_intervals_forced; ulonglong limit_found_rows; - ha_rows cuted_fields, sent_row_count, examined_row_count; + ulonglong tmp_tables_size; ulonglong client_capabilities; + ulonglong cuted_fields, sent_row_count, examined_row_count; + ulonglong affected_rows; + ulonglong bytes_sent_old; + ulong tmp_tables_used; + ulong tmp_tables_disk_used; + ulong query_plan_fsort_passes; ulong query_plan_flags; uint in_sub_stmt; /* 0, SUB_STMT_TRIGGER or SUB_STMT_FUNCTION */ bool enable_slow_log; bool last_insert_id_used; - SAVEPOINT *savepoints; enum enum_check_fields count_cuted_fields; }; @@ -1988,6 +1997,16 @@ struct wait_for_commit void reinit(); }; +/* + Structure to store the start time for a query +*/ + +typedef struct +{ + my_time_t start_time; + ulong start_time_sec_part; + ulonglong start_utime, utime_after_lock; +} QUERY_START_TIME_INFO; extern "C" void my_message_sql(uint error, const char *str, myf MyFlags); @@ -2687,6 +2706,14 @@ public: { m_row_count_func= row_count_func; } + inline void set_affected_rows(longlong row_count_func) + { + /* + We have to add to affected_rows (used by slow log), as otherwise + information for 'call' will be wrong + */ + affected_rows+= (row_count_func >= 0 ? row_count_func : 0); + } ha_rows cuted_fields; @@ -2716,6 +2743,9 @@ public: ha_rows get_examined_row_count() const { return m_examined_row_count; } + ulonglong get_affected_rows() const + { return affected_rows; } + void set_sent_row_count(ha_rows count); void set_examined_row_count(ha_rows count); @@ -2793,8 +2823,16 @@ public: /* Statement id is thread-wide. This counter is used to generate ids */ ulong statement_id_counter; ulong rand_saved_seed1, rand_saved_seed2; + + /* The following variables are used when printing to slow log */ ulong query_plan_flags; ulong query_plan_fsort_passes; + ulong tmp_tables_used; + ulong tmp_tables_disk_used; + ulonglong tmp_tables_size; + ulonglong bytes_sent_old; + ulonglong affected_rows; /* Number of changed rows */ + pthread_t real_id; /* For debugging */ my_thread_id thread_id, thread_dbug_id; uint32 os_thread_id; @@ -2874,7 +2912,6 @@ public: uint8 failed_com_change_user; bool slave_thread; bool extra_port; /* If extra connection */ - bool no_errors; /** @@ -2918,7 +2955,7 @@ public: */ bool charset_is_system_charset, charset_is_collation_connection; bool charset_is_character_set_filesystem; - bool enable_slow_log; /* enable slow log for current statement */ + bool enable_slow_log; /* Enable slow log for current statement */ bool abort_on_warning; bool got_warning; /* Set on call to push_warning() */ /* set during loop of derived table processing */ @@ -2950,6 +2987,7 @@ public: the query. 0 if no error on the master. */ int slave_expected_error; + enum_sql_command last_sql_command; // Last sql_command exceuted in mysql_execute_command() sp_rcontext *spcont; // SP runtime context sp_cache *sp_proc_cache; @@ -3242,6 +3280,20 @@ public: MYSQL_SET_STATEMENT_LOCK_TIME(m_statement_psi, (utime_after_lock - start_utime)); } + void get_time(QUERY_START_TIME_INFO *time_info) + { + time_info->start_time= start_time; + time_info->start_time_sec_part= start_time_sec_part; + time_info->start_utime= start_utime; + time_info->utime_after_lock= utime_after_lock; + } + void set_time(QUERY_START_TIME_INFO *time_info) + { + start_time= time_info->start_time; + start_time_sec_part= time_info->start_time_sec_part; + start_utime= time_info->start_utime; + utime_after_lock= time_info->utime_after_lock; + } ulonglong current_utime() { return microsecond_interval_timer(); } /* Tell SHOW PROCESSLIST to show time from this point */ @@ -3260,7 +3312,7 @@ public: void update_server_status() { set_time_for_next_stage(); - if (utime_after_query > utime_after_lock + variables.long_query_time) + if (utime_after_query >= utime_after_lock + variables.long_query_time) server_status|= SERVER_QUERY_WAS_SLOW; } inline ulonglong found_rows(void) @@ -3658,6 +3710,9 @@ public: void restore_backup_open_tables_state(Open_tables_backup *backup); void reset_sub_statement_state(Sub_statement_state *backup, uint new_state); void restore_sub_statement_state(Sub_statement_state *backup); + void store_slow_query_state(Sub_statement_state *backup); + void reset_slow_query_state(); + void add_slow_query_state(Sub_statement_state *backup); void set_n_backup_active_arena(Query_arena *set, Query_arena *backup); void restore_active_arena(Query_arena *set, Query_arena *backup); @@ -4457,6 +4512,12 @@ public: */ bool restore_from_local_lex_to_old_lex(LEX *oldlex); + inline void prepare_logs_for_admin_command() + { + enable_slow_log&= !MY_TEST(variables.log_slow_disabled_statements & + LOG_SLOW_DISABLE_ADMIN); + query_plan_flags|= QPLAN_ADMIN; + } }; inline void add_to_active_threads(THD *thd) @@ -4483,11 +4544,12 @@ inline void unlink_not_visible_thd(THD *thd) /** A short cut for thd->get_stmt_da()->set_ok_status(). */ inline void -my_ok(THD *thd, ulonglong affected_rows= 0, ulonglong id= 0, +my_ok(THD *thd, ulonglong affected_rows_arg= 0, ulonglong id= 0, const char *message= NULL) { - thd->set_row_count_func(affected_rows); - thd->get_stmt_da()->set_ok_status(affected_rows, id, message); + thd->set_row_count_func(affected_rows_arg); + thd->set_affected_rows(affected_rows_arg); + thd->get_stmt_da()->set_ok_status(affected_rows_arg, id, message); } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 9b615c2f1e7..da0ed4a734a 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -99,7 +99,6 @@ #include "debug_sync.h" #include "probes_mysql.h" #include "set_var.h" -#include "log_slow.h" #include "sql_bootstrap.h" #include "sql_sequence.h" @@ -1599,11 +1598,18 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->m_statement_psi= MYSQL_REFINE_STATEMENT(thd->m_statement_psi, com_statement_info[command]. m_key); + /* + We should always call reset_for_next_command() before a query. + mysql_parse() will do this for queries. Ensure it's also done + for other commands. + */ + if (command != COM_QUERY) + thd->reset_for_next_command(); thd->set_command(command); /* - Commands which always take a long time are logged into - the slow log only if opt_log_slow_admin_statements is set. + thd->variables.log_slow_disabled_statements defines which statements + are logged to slow log */ thd->enable_slow_log= thd->variables.sql_log_slow; thd->query_plan_flags= QPLAN_INIT; @@ -1886,6 +1892,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->set_query_and_id(beginning_of_next_stmt, length, thd->charset(), next_query_id()); + /* Count each statement from the client. */ @@ -1895,7 +1902,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->set_time(); /* Reset the query start time. */ parser_state.reset(beginning_of_next_stmt, length); - /* TODO: set thd->lex->sql_command to SQLCOM_END here */ if (WSREP_ON) wsrep_mysql_parse(thd, beginning_of_next_stmt, length, &parser_state, @@ -1953,7 +1959,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; } packet= arg_end + 1; - thd->reset_for_next_command(); // thd->reset_for_next_command reset state => restore it if (is_next_command) { @@ -2045,8 +2050,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, status_var_increment(thd->status_var.com_other); - thd->enable_slow_log&= opt_log_slow_admin_statements; - thd->query_plan_flags|= QPLAN_ADMIN; + thd->prepare_logs_for_admin_command(); if (check_global_access(thd, REPL_SLAVE_ACL)) break; @@ -2422,9 +2426,12 @@ com_multi_end: /* + Log query to slow queries, if it passes filtering + @note This function must call delete_explain_query(). */ + void log_slow_statement(THD *thd) { DBUG_ENTER("log_slow_statement"); @@ -2436,19 +2443,26 @@ void log_slow_statement(THD *thd) */ if (unlikely(thd->in_sub_stmt)) goto end; // Don't set time for sub stmt + if (!thd->enable_slow_log || !global_system_variables.sql_log_slow) + goto end; + if ((thd->server_status & + (SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) && + !(sql_command_flags[thd->last_sql_command] & CF_STATUS_COMMAND) && + (!thd->variables.log_slow_filter || + (thd->variables.log_slow_filter & QPLAN_NOT_USING_INDEX))) + { + thd->query_plan_flags|= QPLAN_NOT_USING_INDEX; + /* We are always logging no index queries if enabled in filter */ + thd->server_status|= SERVER_QUERY_WAS_SLOW; + } /* Follow the slow log filter configuration. */ - if (!thd->enable_slow_log || !global_system_variables.sql_log_slow || - (thd->variables.log_slow_filter - && !(thd->variables.log_slow_filter & thd->query_plan_flags))) + if (thd->variables.log_slow_filter && + !(thd->variables.log_slow_filter & thd->query_plan_flags)) goto end; - - if (((thd->server_status & SERVER_QUERY_WAS_SLOW) || - ((thd->server_status & - (SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) && - opt_log_queries_not_using_indexes && - !(sql_command_flags[thd->lex->sql_command] & CF_STATUS_COMMAND))) && + + if ((thd->server_status & SERVER_QUERY_WAS_SLOW) && thd->get_examined_row_count() >= thd->variables.min_examined_row_limit) { thd->status_var.long_query_count++; @@ -2863,6 +2877,7 @@ static bool do_execute_sp(THD *thd, sp_head *sp) { /* bits that should be cleared in thd->server_status */ uint bits_to_be_cleared= 0; + ulonglong affected_rows; if (sp->m_flags & sp_head::MULTI_RESULTS) { if (!(thd->client_capabilities & CLIENT_MULTI_RESULTS)) @@ -2902,7 +2917,10 @@ static bool do_execute_sp(THD *thd, sp_head *sp) return 1; // Substatement should already have sent error } + affected_rows= thd->affected_rows; // Affected rows for all sub statements + thd->affected_rows= 0; // Reset total, as my_ok() adds to it my_ok(thd, (thd->get_row_count_func() < 0) ? 0 : thd->get_row_count_func()); + thd->affected_rows= affected_rows; // Restore original value return 0; } @@ -3133,6 +3151,13 @@ bool Sql_cmd_call::execute(THD *thd) if (do_execute_sp(thd, sp)) return true; + + /* + Disable slow log for the above call(), if calls are disabled. + Instead we will log the executed statements to the slow log. + */ + if (thd->variables.log_slow_disabled_statements & LOG_SLOW_DISABLE_CALL) + thd->enable_slow_log= 0; } return false; } @@ -3214,6 +3239,12 @@ mysql_execute_command(THD *thd) table_list.first); /* + Remember last commmand executed, so that we can use it in functions called by + dispatch_command() + */ + thd->last_sql_command= lex->sql_command; + + /* Reset warning count for each query that uses tables A better approach would be to reset this for any commands that is not a SHOW command or a select that only access local @@ -4245,8 +4276,7 @@ end_with_restore_list: and thus classify as slow administrative statements just like ALTER TABLE. */ - thd->enable_slow_log&= opt_log_slow_admin_statements; - thd->query_plan_flags|= QPLAN_ADMIN; + thd->prepare_logs_for_admin_command(); bzero((char*) &create_info, sizeof(create_info)); create_info.db_type= 0; @@ -7481,6 +7511,7 @@ void THD::reset_for_next_command() reset_dynamic(&thd->user_var_events); thd->user_var_events_alloc= thd->mem_root; } + thd->enable_slow_log= thd->variables.sql_log_slow; thd->clear_error(); thd->get_stmt_da()->reset_diagnostics_area(); thd->get_stmt_da()->reset_for_next_command(); @@ -7488,8 +7519,7 @@ void THD::reset_for_next_command() thd->m_sent_row_count= thd->m_examined_row_count= 0; thd->accessed_rows_and_keys= 0; - thd->query_plan_flags= QPLAN_INIT; - thd->query_plan_fsort_passes= 0; + reset_slow_query_state(); thd->reset_current_stmt_binlog_format_row(); thd->binlog_unsafe_warning_flags= 0; diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index 08e8da3f030..df37dd5ff42 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -91,7 +91,7 @@ bool Sql_cmd_alter_table_exchange_partition::execute(THD *thd) /* Not allowed with EXCHANGE PARTITION */ DBUG_ASSERT(!create_info.data_file_name && !create_info.index_file_name); - thd->enable_slow_log= opt_log_slow_admin_statements; + thd->prepare_logs_for_admin_command(); DBUG_RETURN(exchange_partition(thd, first_table, &alter_info)); } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 047921e6a41..e50b6a0820a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -50,7 +50,6 @@ #include "filesort.h" // filesort_free_buffers #include "sql_union.h" // mysql_union #include "opt_subselect.h" -#include "log_slow.h" #include "sql_derived.h" #include "sql_statistics.h" #include "sql_cte.h" @@ -16718,8 +16717,6 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List<Item> &fields, (int) distinct, (int) save_sum_fields, (ulong) rows_limit, MY_TEST(group))); - thd->query_plan_flags|= QPLAN_TMP_TABLE; - if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES)) temp_pool_slot = bitmap_lock_set_next(&temp_pool); @@ -17842,7 +17839,6 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo, table->in_use->inc_status_created_tmp_disk_tables(); table->in_use->inc_status_created_tmp_tables(); - table->in_use->query_plan_flags|= QPLAN_TMP_DISK; share->db_record_offset= 1; table->set_created(); DBUG_RETURN(0); @@ -17997,7 +17993,6 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo, } table->in_use->inc_status_created_tmp_disk_tables(); table->in_use->inc_status_created_tmp_tables(); - table->in_use->query_plan_flags|= QPLAN_TMP_DISK; share->db_record_offset= 1; table->created= TRUE; DBUG_RETURN(0); @@ -18164,7 +18159,12 @@ free_tmp_table(THD *thd, TABLE *entry) { entry->file->ha_index_or_rnd_end(); if (entry->db_stat) + { + entry->file->info(HA_STATUS_VARIABLE); + thd->tmp_tables_size+= (entry->file->stats.data_file_length + + entry->file->stats.index_file_length); entry->file->ha_drop_table(entry->s->table_name.str); + } else entry->file->ha_delete_table(entry->s->table_name.str); delete entry->file; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index e8bc1531de7..17df5d6dbde 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -9868,8 +9868,8 @@ bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool table_copy) HA_CREATE_INFO create_info; Alter_info alter_info; TABLE_LIST *next_table= table_list->next_global; - DBUG_ENTER("mysql_recreate_table"); + /* Set lock type which is appropriate for ALTER TABLE. */ table_list->lock_type= TL_READ_NO_INSERT; /* Same applies to MDL request. */ @@ -9887,6 +9887,8 @@ bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool table_copy) if (table_copy) alter_info.requested_algorithm= Alter_info::ALTER_TABLE_ALGORITHM_COPY; + thd->prepare_logs_for_admin_command(); + bool res= mysql_alter_table(thd, NullS, NullS, &create_info, table_list, &alter_info, 0, (ORDER *) 0, 0); diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index f637a6d5c5a..1eaa0acdc9a 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -50,7 +50,6 @@ #include "sql_base.h" // close_cached_tables #include "hostname.h" // host_cache_size #include <myisam.h> -#include "log_slow.h" #include "debug_sync.h" // DEBUG_SYNC #include "sql_show.h" @@ -1203,25 +1202,28 @@ static Sys_var_charptr Sys_log_error( CMD_LINE(OPT_ARG, OPT_LOG_ERROR), IN_FS_CHARSET, DEFAULT(disabled_my_option)); -static Sys_var_mybool Sys_log_queries_not_using_indexes( +static Sys_var_bit Sys_log_queries_not_using_indexes( "log_queries_not_using_indexes", "Log queries that are executed without benefit of any index to the " - "slow log if it is open", - GLOBAL_VAR(opt_log_queries_not_using_indexes), - CMD_LINE(OPT_ARG), DEFAULT(FALSE)); + "slow log if it is open. Same as log_slow_filter='not_using_index'", + SESSION_VAR(log_slow_filter), CMD_LINE(OPT_ARG), QPLAN_NOT_USING_INDEX, + DEFAULT(FALSE)); -static Sys_var_mybool Sys_log_slow_admin_statements( +static Sys_var_bit Sys_log_slow_admin_statements( "log_slow_admin_statements", - "Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to " - "the slow log if it is open.", - GLOBAL_VAR(opt_log_slow_admin_statements), - CMD_LINE(OPT_ARG), DEFAULT(TRUE)); + "Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements " + "to the slow log if it is open. Resets or sets the option 'admin' in " + "log_slow_disabled_statements", + SESSION_VAR(log_slow_disabled_statements), + CMD_LINE(OPT_ARG), REVERSE(LOG_SLOW_DISABLE_ADMIN), DEFAULT(TRUE)); -static Sys_var_mybool Sys_log_slow_slave_statements( +static Sys_var_bit Sys_log_slow_slave_statements( "log_slow_slave_statements", - "Log slow statements executed by slave thread to the slow log if it is open.", - GLOBAL_VAR(opt_log_slow_slave_statements), - CMD_LINE(OPT_ARG), DEFAULT(TRUE)); + "Log slow statements executed by slave thread to the slow log if it is " + "open. Resets or sets the option 'slave' in " + "log_slow_disabled_statements", + SESSION_VAR(log_slow_disabled_statements), + CMD_LINE(OPT_ARG), REVERSE(LOG_SLOW_DISABLE_SLAVE), DEFAULT(TRUE)); static Sys_var_ulong Sys_log_warnings( "log_warnings", @@ -4355,6 +4357,7 @@ static bool fix_log_state(sys_var *self, THD *thd, enum_var_type type) return res; } + static bool check_not_empty_set(sys_var *self, THD *thd, set_var *var) { return var->save_result.ulonglong_value == 0; @@ -5246,15 +5249,42 @@ static Sys_var_keycache Sys_key_cache_segments( ON_UPDATE(repartition_keycache)); static const char *log_slow_filter_names[]= -{ "admin", "filesort", "filesort_on_disk", "full_join", "full_scan", - "query_cache", "query_cache_miss", "tmp_table", "tmp_table_on_disk", 0 +{ + "admin", "filesort", "filesort_on_disk", "filsort_priority_queue", + "full_join", "full_scan", "not_using_index", "query_cache", + "query_cache_miss", "tmp_table", "tmp_table_on_disk", 0 }; + + static Sys_var_set Sys_log_slow_filter( "log_slow_filter", - "Log only certain types of queries", + "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", SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG), log_slow_filter_names, - DEFAULT(my_set_bits(array_elements(log_slow_filter_names)-1))); + /* by default we log all queries except 'not_using_index' */ + DEFAULT(my_set_bits(array_elements(log_slow_filter_names)-1) & + ~QPLAN_NOT_USING_INDEX)); + +static const char *log_slow_disabled_statements_names[]= +{ "admin", "call", "slave", "sp", 0 }; + +static const char *log_disabled_statements_names[]= +{ "slave", "sp", 0 }; + +static Sys_var_set Sys_log_slow_disabled_statements( + "log_slow_disabled_statements", + "Don't log certain types of statements to slow log", + SESSION_VAR(log_slow_disabled_statements), CMD_LINE(REQUIRED_ARG), + log_slow_disabled_statements_names, + DEFAULT(LOG_SLOW_DISABLE_SP)); + +static Sys_var_set Sys_log_disabled_statements( + "log_disabled_statements", + "Don't log certain types of statements to general log", + SESSION_VAR(log_disabled_statements), CMD_LINE(REQUIRED_ARG), + log_disabled_statements_names, + DEFAULT(LOG_DISABLE_SP), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_has_super)); static const char *default_regex_flags_names[]= { diff --git a/sql/sys_vars.ic b/sql/sys_vars.ic index f3837f0246a..0b104625159 100644 --- a/sql/sys_vars.ic +++ b/sql/sys_vars.ic @@ -1764,12 +1764,12 @@ public: binlog_status_arg, on_check_func, on_update_func, substitute) { - option.var_type|= GET_BOOL; + option.var_type|= GET_BIT; reverse_semantics= my_count_bits(bitmask_arg) > 1; bitmask= reverse_semantics ? ~bitmask_arg : bitmask_arg; + option.block_size= reverse_semantics ? -(long) bitmask : bitmask; set(global_var_ptr(), def_val); SYSVAR_ASSERT(def_val < 2); - SYSVAR_ASSERT(getopt.id < 0); // force NO_CMD_LINE SYSVAR_ASSERT(size == sizeof(ulonglong)); } bool session_update(THD *thd, set_var *var) |