Description:
1. The semantics of the 'DEBUG' system variable is not well documented.
In 5.1 it behaves like so: To set a trace file, use SET GLOBAL, e.g. SET
GLOBAL debug='+O,../log/dbug.trace'. Per-session trace files are also
possible. To change other DBUG options, use SET SESSION, e.g. SET
debug='+d,query'. The latter does influence the current session only. In
contrast to other GLOBAL/SESSION behavior, SET GLOBAL DEBUG influences
all sessions, not just the current and all later established (new)
sessions.
2. In 6.0, global setting of a trace file works. But when a test is
started _without_ --debug, no other setting seems to take effect. The
race file is created, but stays empty, whatever one tries with setting
of the system variable.
3. In 6.0, when a test is started _with_ --debug, session settings take
global effect.
How to repeat:
Run the below test case in 5.1 and 6.0 with ./mtr and ./mtr --debug. In
all cases do:
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug.trace
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug1.trace
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug2.trace
In 5.1 you will see the same output, regardsless if --debug is used.
Note that the first FLUSH TABLES proves that SET GLOBAL DEBUG *after*
connection (con1...) activates tracing in con1 too:
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug.trace
T@3 : | | | | >close_cached_tables
T@3 : | | | | <close_cached_tables
T@4 : | | | | >close_cached_tables
T@4 : | | | | <close_cached_tables
T@4 : dispatch_command: query: SELECT 'con1 - now should be in dbug.trace'
T@4 : dispatch_command: query: SET SESSION debug='+O,../log/dbug1.trace'
T@5 : | | | | >close_cached_tables
T@5 : | | | | <close_cached_tables
T@5 : dispatch_command: query: SELECT 'con2 - now should be in dbug.trace'
T@5 : dispatch_command: query: SET SESSION debug='+O,../log/dbug2.trace'
T@7 : | | >close_cached_tables
T@7 : | | <close_cached_tables
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug1.trace
T@4 : dispatch_command: query: SELECT 'con1 - now should be in dbug1.trace'
T@4 : dispatch_command: query: SELECT 'con1 - still should be in dbug1.trace'
T@4 : dispatch_command: query: SET SESSION debug='-d:-t:-i'
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug2.trace
T@5 : dispatch_command: query: SELECT 'con2 - now should be in dbug2.trace'
T@5 : dispatch_command: query: SELECT 'con2 - still should be in dbug2.trace'
T@5 : dispatch_command: query: SET SESSION debug='-d:-t:-i'
In 6.0, _without_ --debug, you will see that dbug1.trace and dbug2.trace
don't exist. dbug.trace is empty.
In 6.0, _with_ --debug, you will see that all settings influence all
sessions.
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug.trace
T@4 : | | | | >close_cached_tables
T@4 : | | | | <close_cached_tables
T@5 : | | | | >close_cached_tables
T@5 : | | | | <close_cached_tables
T@5 : dispatch_command: query: SELECT 'con1 - now should be in dbug.trace'
T@5 : dispatch_command: query: SET SESSION debug='+O,../log/dbug1.trace'
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug1.trace
T@5 : dispatch_command: query: SELECT 'con1 - now should be in dbug1.trace'
T@6 : dispatch_command: query: FLUSH TABLES
T@6 : dispatch_command: query: SELECT 'con2 - should not be in dbug.trace'
T@6 : dispatch_command: query: SET SESSION debug='+d,query:-t'
T@6 : dispatch_command: query: SELECT 'con2 - now should be in dbug.trace'
T@6 : dispatch_command: query: SET SESSION debug='+O,../log/dbug2.trace'
egrep 'query:|close_cached_tables' mysql-test/var/log/dbug2.trace
T@6 : dispatch_command: query: SELECT 'con2 - now should be in dbug2.trace'
T@5 : dispatch_command: query: SELECT 'con1 - still should be in dbug1.trace'
T@5 : dispatch_command: query: SET SESSION debug='-d:-t:-i'
========================
Here is the test case:
========================
#
# Bug# - DBUG problems in 6.0
#
# Set a trace file and deactivate debugging and tracing, if activated.
#
SET GLOBAL debug='-d:-t:-i:+O,../log/dbug.trace';
SELECT 'default - should not be in dbug.trace';
#
# Create a session that should inherit the above setting, but not the below.
#
connect (con1,localhost,root,,);
--connection default
#
# Activate tracing for all sessions, except con1.
#
SET GLOBAL debug='+t:+i';
#
# Let an uncommon function appear in the trace.
#
FLUSH TABLES;
#
# Create sessions that should inherit the above settings.
#
connect (con2,localhost,root,,);
--connection default
#
--connection con1
# Let an uncommon function appear in the trace.
FLUSH TABLES;
SELECT 'con1 - should not be in dbug.trace';
SET SESSION debug='+d,query:-t';
SELECT 'con1 - now should be in dbug.trace';
# Changing the trace file cannot be done per session
SET SESSION debug='+O,../log/dbug1.trace';
SELECT 'con1 - now should be in dbug1.trace';
#
--connection con2
# Let an uncommon function appear in the trace.
FLUSH TABLES;
SELECT 'con2 - should not be in dbug.trace';
SET SESSION debug='+d,query:-t';
SELECT 'con2 - now should be in dbug.trace';
# Changing the trace file cannot be done per session
SET SESSION debug='+O,../log/dbug2.trace';
SELECT 'con2 - now should be in dbug2.trace';
#
--connection con1
SELECT 'con1 - still should be in dbug1.trace';
SET SESSION debug='-d:-t:-i';
SELECT 'con1 - should not be in a trace';
#
--connection con2
SELECT 'con2 - still should be in dbug2.trace';
SET SESSION debug='-d:-t:-i';
SELECT 'con2 - should not be in a trace';
#
# Cleanup
#
--connection default
disconnect con1;
disconnect con2;
========================
Here is the result file:
========================
SET GLOBAL debug='-d:-t:-i:+O,../log/dbug.trace';
SELECT 'default - should not be in dbug.trace';
default - should not be in dbug.trace
default - should not be in dbug.trace
SET GLOBAL debug='+t:+i';
FLUSH TABLES;
FLUSH TABLES;
SELECT 'con1 - should not be in dbug.trace';
con1 - should not be in dbug.trace
con1 - should not be in dbug.trace
SET SESSION debug='+d,query:-t';
SELECT 'con1 - now should be in dbug.trace';
con1 - now should be in dbug.trace
con1 - now should be in dbug.trace
SET SESSION debug='+O,../log/dbug1.trace';
SELECT 'con1 - now should be in dbug1.trace';
con1 - now should be in dbug1.trace
con1 - now should be in dbug1.trace
FLUSH TABLES;
SELECT 'con2 - should not be in dbug.trace';
con2 - should not be in dbug.trace
con2 - should not be in dbug.trace
SET SESSION debug='+d,query:-t';
SELECT 'con2 - now should be in dbug.trace';
con2 - now should be in dbug.trace
con2 - now should be in dbug.trace
SET SESSION debug='+O,../log/dbug2.trace';
SELECT 'con2 - now should be in dbug2.trace';
con2 - now should be in dbug2.trace
con2 - now should be in dbug2.trace
SELECT 'con1 - still should be in dbug1.trace';
con1 - still should be in dbug1.trace
con1 - still should be in dbug1.trace
SET SESSION debug='-d:-t:-i';
SELECT 'con1 - should not be in a trace';
con1 - should not be in a trace
con1 - should not be in a trace
SELECT 'con2 - still should be in dbug2.trace';
con2 - still should be in dbug2.trace
con2 - still should be in dbug2.trace
SET SESSION debug='-d:-t:-i';
SELECT 'con2 - should not be in a trace';
con2 - should not be in a trace
con2 - should not be in a trace