diff --git a/mysql-test/r/log_state.result b/mysql-test/r/log_state.result index 5c3e3d789a1..56e30ac59f8 100644 --- a/mysql-test/r/log_state.result +++ b/mysql-test/r/log_state.result @@ -309,6 +309,30 @@ 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; End of 5.1 tests + +# -- +# -- Bug#38124: "general_log_file" variable silently unset when +# -- using expression +# -- +SET GLOBAL general_log_file = DEFAULT; +SELECT @@general_log_file INTO @my_glf; +SET GLOBAL general_log_file = 'BUG38124.LOG'; +SELECT @@general_log_file; +@@general_log_file +BUG38124.LOG +SET GLOBAL general_log_file = concat('BUG38124-2.LOG'); +SELECT @@general_log_file; +@@general_log_file +BUG38124-2.LOG +SET GLOBAL general_log_file = substr('BUG38124-2.LOG',3,6); +SELECT @@general_log_file; +@@general_log_file +G38124 +SET GLOBAL general_log_file = DEFAULT; +SELECT @@general_log_file = @my_glf; +@@general_log_file = @my_glf +1 +SET GLOBAL general_log_file = @old_general_log_file; # Close connection con1 SET global general_log = @old_general_log; SET global general_log_file = @old_general_log_file; diff --git a/mysql-test/t/log_state.test b/mysql-test/t/log_state.test index a867b5b0885..4d8c8fc6e74 100644 --- a/mysql-test/t/log_state.test +++ b/mysql-test/t/log_state.test @@ -1,16 +1,5 @@ ### 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 = @ -# SET GLOBAL slow_query_log = @ -# 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 @@ -166,16 +155,6 @@ 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 -} - ########################################################################### @@ -278,15 +257,6 @@ 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 -} ########################################################################### @@ -307,15 +277,6 @@ SHOW VARIABLES LIKE '%log_file'; --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. @@ -351,19 +312,43 @@ 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 + +########################################################################### + +--echo +--echo # -- +--echo # -- Bug#38124: "general_log_file" variable silently unset when +--echo # -- using expression +--echo # -- + +# Store away the special DEFAULT value so we +# can compare it later, then try to set the +# general_log_file using different functions +# and expressions. + +SET GLOBAL general_log_file = DEFAULT; +SELECT @@general_log_file INTO @my_glf; + +SET GLOBAL general_log_file = 'BUG38124.LOG'; +SELECT @@general_log_file; + +SET GLOBAL general_log_file = concat('BUG38124-2.LOG'); +SELECT @@general_log_file; + +SET GLOBAL general_log_file = substr('BUG38124-2.LOG',3,6); +SELECT @@general_log_file; + +SET GLOBAL general_log_file = DEFAULT; +SELECT @@general_log_file = @my_glf; + + +## Reset to initial values +SET GLOBAL general_log_file = @old_general_log_file; + + --enable_ps_protocol # @@ -380,15 +365,6 @@ 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 file that was created in the "default location" # i.e var/run diff --git a/sql/set_var.cc b/sql/set_var.cc index f5f89f48347..d9e324e3811 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -2535,9 +2535,20 @@ bool update_sys_var_str_path(THD *thd, sys_var_str *var_str, { MYSQL_QUERY_LOG *file_log; char buff[FN_REFLEN]; - char *res= 0, *old_value=(char *)(var ? var->value->str_value.ptr() : 0); + char *res= 0, *old_value= 0; bool result= 0; - uint str_length= (var ? var->value->str_value.length() : 0); + uint str_length= 0; + + if (var) + { + String str(buff, sizeof(buff), system_charset_info), *newval; + + newval= var->value->val_str(&str); + old_value= newval->c_ptr(); + str_length= strlen(old_value); + } + + switch (log_type) { case QUERY_LOG_SLOW: