### t/log_state.test ###
#
# This test suffers from server
# Bug#38124 "general_log_file" variable silently unset when using expression
# In short:
#    SET GLOBAL general_log_file = @<whatever>
#    SET GLOBAL slow_query_log = @<whatever>
# cause that the value of these server system variables is set to default
# instead of the assigned values. There comes no error message or warning.
# If this bug is fixed please
# 1. try this test with "let $fixed_bug38124 = 0;"
# 2. remove all workarounds if 1. was successful.
let $fixed_bug38124 = 0;

--source include/not_embedded.inc
--source include/have_csv.inc

# Several subtests modify global variables. Save the initial values only here,
# but reset to the initial values per subtest.
SET @old_general_log= @@global.general_log;
SET @old_general_log_file= @@global.general_log_file;
SET @old_slow_query_log= @@global.slow_query_log;
SET @old_slow_query_log_file= @@global.slow_query_log_file;


--disable_ps_protocol

set global general_log= OFF;
truncate table mysql.general_log;
truncate table mysql.slow_log;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
flush logs;
set global general_log= ON;
create table t1(f1 int);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
select * from mysql.general_log;
set global general_log= OFF;
drop table t1;
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
select * from mysql.general_log;
set global general_log= ON;
flush logs;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';

--echo # Establish connection con1 (user=root)
connect (con1,localhost,root,,);
--echo # Switch to connection con1
connection con1;
# Please increase @long_query_time if the corresponding selects show an
# additional unexpected entry like
#    start_time ... sql_text
#    TIMESTAMP  ... set session long_query_time=...
# (Bug#40377 sporadic pushbuild failure in log_state: result mismatch)
--replace_result 2 <long_query_time>
set @long_query_time = 2;
set session long_query_time = @long_query_time;
select sleep(@long_query_time + 1);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
--echo # Switch to connection default
connection default;

set global slow_query_log= ON;
--echo # Switch to connection con1
connection con1;
set session long_query_time = @long_query_time;
select sleep(@long_query_time + 1);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
--echo # Switch to connection default
connection default;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';

set global general_log= ON;
set global general_log= OFF;
set global general_log= OFF;
set global slow_query_log= ON;
set global slow_query_log= OFF;
set global slow_query_log= OFF;

set global general_log= ON;
truncate table mysql.general_log;
create table t1(f1 int);
drop table t1;
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
select * from mysql.general_log;
set global general_log= OFF;
truncate table mysql.general_log;
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
select * from mysql.general_log;
set global general_log= ON;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';

--replace_column 2 #
show variables like 'general_log_file';
--replace_column 2 #
show variables like 'slow_query_log_file';
show variables like 'log_output';

# Can't set general_log_file to a non existing file
--error ER_WRONG_VALUE_FOR_VAR
set global general_log_file='/not existing path/log.master';

# Can't set general_log_file to a directory
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--error ER_WRONG_VALUE_FOR_VAR
eval set global general_log_file='$MYSQLTEST_VARDIR';

# Can't set general_log_file to empty string
--error ER_WRONG_VALUE_FOR_VAR
set global general_log_file='';

--replace_column 2 #
show variables like 'general_log_file';
set global general_log= OFF;
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
eval set global general_log_file='$MYSQLTEST_VARDIR/tmp/log.master';
set global general_log= ON;
create table t1(f1 int);
drop table t1;
set global general_log= OFF;
set global general_log_file=default;
set global general_log= ON;
create table t1(f1 int);
drop table t1;
--replace_column 2 #
show variables like 'general_log_file';
--replace_column 2 #
show variables like 'slow_query_log_file';

set global general_log= default;
set global slow_query_log= default;
set global general_log_file= default;
set global slow_query_log_file= default;
show variables like 'general_log';
show variables like 'slow_query_log';
set global general_log=ON;
set global log_output=default;
show variables like 'log_output';
set global general_log=OFF;
set global log_output=FILE;
truncate table mysql.general_log;
show variables like 'log_output';
set global general_log=ON;
create table t1(f1 int);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
select * from mysql.general_log;
set global general_log=OFF;
set global log_output="FILE,TABLE";
show variables like 'log_output';
set global general_log=ON;
drop table t1;
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
select * from mysql.general_log;

# Reset to initial values
SET @@global.general_log = @old_general_log;
SET @@global.general_log_file = @old_general_log_file;
SET @@global.slow_query_log = @old_slow_query_log;
SET @@global.slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
   --disable_query_log
   let $my_var = `SELECT @old_general_log_file`;
   eval SET @@global.general_log_file = '$my_var';
   let $my_var = `SELECT @old_slow_query_log_file`;
   eval SET @@global.slow_query_log_file = '$my_var';
   --enable_query_log
}


###########################################################################

#
# Bug#29129 (Resetting general_log while the GLOBAL READ LOCK is set causes
#            a deadlock)
#

# Test ON->OFF transition under a GLOBAL READ LOCK
SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON;

FLUSH TABLES WITH READ LOCK;

SET GLOBAL general_log = OFF;
SET GLOBAL slow_query_log = OFF;

UNLOCK TABLES;

# Test OFF->ON transition under a GLOBAL READ LOCK
FLUSH TABLES WITH READ LOCK;

SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON;

UNLOCK TABLES;

# Test ON->OFF transition under a GLOBAL READ_ONLY
SET GLOBAL READ_ONLY = ON;

SET GLOBAL general_log = OFF;
SET GLOBAL slow_query_log = OFF;

SET GLOBAL READ_ONLY = OFF;

# Test OFF->ON transition under a GLOBAL READ_ONLY
SET GLOBAL READ_ONLY = ON;

SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON;

SET GLOBAL READ_ONLY = OFF;

# Reset to initial values
SET GLOBAL general_log = @old_general_log;
SET GLOBAL slow_query_log = @old_slow_query_log;


###########################################################################

#
# Bug#29131: SHOW VARIABLES reports variable 'log' but SET doesn't recognize it
#

SET GLOBAL general_log = ON;

SHOW VARIABLES LIKE 'general_log';
SHOW VARIABLES LIKE 'log';
SELECT @@general_log, @@log;
SET GLOBAL log = 0;
SHOW VARIABLES LIKE 'general_log';
SHOW VARIABLES LIKE 'log';
SELECT @@general_log, @@log;
SET GLOBAL general_log = 1;
SHOW VARIABLES LIKE 'general_log';
SHOW VARIABLES LIKE 'log';
SELECT @@general_log, @@log;

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'log_slow_queries';
SELECT @@slow_query_log, @@log_slow_queries;
SET GLOBAL log_slow_queries = 0;
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'log_slow_queries';
SELECT @@slow_query_log, @@log_slow_queries;
SET GLOBAL slow_query_log = 1;
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'log_slow_queries';
SELECT @@slow_query_log, @@log_slow_queries;

SET GLOBAL general_log = @old_general_log;
SET GLOBAL slow_query_log = @old_slow_query_log;


###########################################################################

#
# Bug#31604: server crash when setting slow_query_log_file/general_log_file
#

--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL general_log_file= CONCAT('/not existing path/log.maste', 'r');
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL general_log_file= NULL;
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL slow_query_log_file= CONCAT('/not existing path/log.maste', 'r');
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL slow_query_log_file= NULL;

# Reset to initial values in case a setting above was successful.
SET GLOBAL general_log_file= @old_general_log_file;
SET GLOBAL slow_query_log_file= @old_slow_query_log_file;
if(!$fixed_bug38124)
{
   --disable_query_log
   let $my_var = `SELECT @old_general_log_file`;
   eval SET @@global.general_log_file = '$my_var';
   let $my_var = `SELECT @old_slow_query_log_file`;
   eval SET @@global.slow_query_log_file = '$my_var';
   --enable_query_log
}

###########################################################################

--echo
--echo # --
--echo # -- Bug#32748: Inconsistent handling of assignments to
--echo # --            general_log_file/slow_query_log_file.
--echo # --

--echo
SET GLOBAL general_log_file = 'bug32748.query.log';
SET GLOBAL slow_query_log_file = 'bug32748.slow.log';

--echo
SHOW VARIABLES LIKE '%log_file';

# Reset to initial values
--echo
SET GLOBAL general_log_file = @old_general_log_file;
SET GLOBAL slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
   --disable_query_log
   let $my_var = `SELECT @old_general_log_file`;
   eval SET @@global.general_log_file = '$my_var';
   let $my_var = `SELECT @old_slow_query_log_file`;
   eval SET @@global.slow_query_log_file = '$my_var';
   --enable_query_log
}

--echo
--echo # -- End of Bug#32748.


###########################################################################

# WL#4403 - deprecate @log and @slow_log_queries variables

# These server system variables are all deprecated
# -- show for command-line as well!
--echo deprecated:
SET GLOBAL log = 0;
SET GLOBAL log_slow_queries = 0;
SET GLOBAL log = DEFAULT;
SET GLOBAL log_slow_queries = DEFAULT;

# These server system variables are NOT deprecated.
--echo not deprecated:
SELECT @@global.general_log_file INTO @my_glf;
SELECT @@global.slow_query_log_file INTO @my_sqlf;
SET GLOBAL general_log = 0;
SET GLOBAL slow_query_log = 0;
SET GLOBAL general_log_file = 'WL4403_G.log';
SET GLOBAL slow_query_log_file = 'WL4403_SQ.log';
SET GLOBAL general_log_file = @my_glf;
SET GLOBAL slow_query_log_file = @my_sqlf;
SET GLOBAL general_log = DEFAULT;
SET GLOBAL slow_query_log = DEFAULT;

## Reset to initial values
SET @@global.general_log = @old_general_log;
SET @@global.general_log_file = @old_general_log_file;
SET @@global.slow_query_log = @old_slow_query_log;
SET @@global.slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
   --disable_query_log
   let $my_var = `SELECT @old_general_log_file`;
   eval SET @@global.general_log_file = '$my_var';
   let $my_var = `SELECT @old_slow_query_log_file`;
   eval SET @@global.slow_query_log_file = '$my_var';
   --enable_query_log
}


--echo End of 5.1 tests

--enable_ps_protocol

#
# Cleanup
#
# Disconnect must be done last to avoid delayed 'Quit' message in general log
--echo # Close connection con1
disconnect con1;
# set back the saved default values
connection default;

# Reset global system variables to initial values if forgotten somewhere above.
SET global general_log = @old_general_log;
SET global general_log_file = @old_general_log_file;
SET global slow_query_log = @old_slow_query_log;
SET global slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
   --disable_query_log
   let $my_var = `SELECT @old_general_log_file`;
   eval SET @@global.general_log_file = '$my_var';
   let $my_var = `SELECT @old_slow_query_log_file`;
   eval SET @@global.slow_query_log_file = '$my_var';
   --enable_query_log
}

# Remove the log files that was created in the "default location"
# i.e var/run
--remove_file $MYSQLTEST_VARDIR/run/mysqld.log
--remove_file $MYSQLTEST_VARDIR/tmp/log.master
