List:Commits« Previous MessageNext Message »
From:Magne Mahre Date:March 31 2009 4:47pm
Subject:bzr commit into mysql-6.0 branch (magne.mahre:2759) Bug#38124
View as plain text  
#At file:///data/z/mysql-6.0-runtime-fix38124/ based on revid:davi.arnaut@stripped

 2759 Magne Mahre	2009-03-31
      Bug #38124 "general_log_file" variable silently unset when using expression
                  
      When assigning the new string value to the variable, the
      Item::str_value member was used.  This is not according to
      the protocol.  str_value is an internal member used for
      temporary assignments, and is not consistently set for all
      string operations.  It is set for constant strings, so it would
      work in these cases, but not for string functions (concat,
      substr, etc.)
                  
      The correct approach is to use Item::val_str(..) to evaluate
      and retrieve the string.

    modified:
      mysql-test/r/log_state.result
      mysql-test/t/log_state.test
      sql/set_var.cc
=== modified file 'mysql-test/r/log_state.result'
--- a/mysql-test/r/log_state.result	2009-01-26 16:32:29 +0000
+++ b/mysql-test/r/log_state.result	2009-03-31 16:47:35 +0000
@@ -311,6 +311,30 @@ SET @@global.general_log_file = @old_gen
 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;

=== modified file 'mysql-test/t/log_state.test'
--- a/mysql-test/t/log_state.test	2009-01-26 16:32:29 +0000
+++ b/mysql-test/t/log_state.test	2009-03-31 16:47:35 +0000
@@ -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 = @<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
@@ -166,16 +155,6 @@ SET @@global.general_log = @old_general_
 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
-}
 
 ###########################################################################
 
@@ -308,15 +278,6 @@ show variables like 'slow_query_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.
@@ -352,19 +313,43 @@ SET @@global.general_log = @old_general_
 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
 
 #
@@ -381,15 +366,6 @@ SET global general_log = @old_general_lo
 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

=== modified file 'sql/set_var.cc'
--- a/sql/set_var.cc	2009-03-27 22:06:26 +0000
+++ b/sql/set_var.cc	2009-03-31 16:47:35 +0000
@@ -2676,9 +2676,20 @@ bool update_sys_var_str_path(THD *thd, s
   MYSQL_QUERY_LOG *file_log= 0;
   MYSQL_BACKUP_LOG *backup_log= 0;
   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);
+  } 
+  
+
 
   /*
     Added support for backup log types.


Attachment: [text/bzr-bundle] bzr/magne.mahre@sun.com-20090331164735-kfh9j8czn9m2oevo.bundle
Thread
bzr commit into mysql-6.0 branch (magne.mahre:2759) Bug#38124Magne Mahre31 Mar