List:Commits« Previous MessageNext Message »
From:gluh Date:April 25 2006 7:24am
Subject:bk commit into 5.1 tree (gluh:1.2362)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of gluh. When gluh does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2362 06/04/25 10:24:31 gluh@stripped +12 -0
  WL#3015: Logging Improvements - No Restarts
  Added SLOW_QUERY_LOG & GENERAL_LOG global variables.
  Added slow-query-log & general-log startup options.
  Added log_output, log_path, log_slow_queries_path global variables
    
   SLOW_QUERY_LOG & GENERAL_LOG can be set 'ON' or 'OFF'
   and turn logs ON/OFF while server is running.
   slow-query-log & general-log startup options
   can be 0 or 1 and enable | disable logging
   at startup. These options have sence
   only if --log & --log-slow-queries are set.
   log_output can be changed only if both(slow&general) logs is disabled.
   log_path can be changed only if general is log disabled.
   log_slow_queries_path can be changed only if slow log is disabled.

  mysql-test/t/log_state.test
    1.1 06/04/25 10:24:21 gluh@stripped +116 -0

  mysql-test/t/log_state-master.opt
    1.1 06/04/25 10:24:21 gluh@stripped +1 -0

  mysql-test/t/log_state.test
    1.0 06/04/25 10:24:21 gluh@stripped +0 -0
    BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/t/log_state.test

  mysql-test/t/log_state-master.opt
    1.0 06/04/25 10:24:21 gluh@stripped +0 -0
    BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/t/log_state-master.opt

  mysql-test/r/log_state.result
    1.1 06/04/25 10:24:20 gluh@stripped +149 -0

  sql/sql_delete.cc
    1.181 06/04/25 10:24:20 gluh@stripped +6 -4
    WL#3015: Logging Improvements - No Restarts
    'truncate table slow_log|general', keep status of logs

  sql/share/errmsg.txt
    1.93 06/04/25 10:24:20 gluh@stripped +2 -0
    WL#3015: Logging Improvements - No Restarts
    added error massage

  sql/set_var.h
    1.85 06/04/25 10:24:20 gluh@stripped +30 -2
    WL#3015: Logging Improvements - No Restarts
    new class sys_var_log_state
    new class sys_var_log_output

  sql/set_var.cc
    1.182 06/04/25 10:24:20 gluh@stripped +244 -1
    WL#3015: Logging Improvements - No Restarts
    added 'slow_query_log' & 'general_log' updatable variables
    added 'log_output', 'log_path', 'log_slow_queries' updatable variables

  mysql-test/r/log_state.result
    1.0 06/04/25 10:24:20 gluh@stripped +0 -0
    BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/r/log_state.result

  sql/mysqld.cc
    1.557 06/04/25 10:24:19 gluh@stripped +41 -6
    WL#3015: Logging Improvements - No Restarts
    added 'slow-query-log' & 'general-log' options

  sql/mysql_priv.h
    1.392 06/04/25 10:24:19 gluh@stripped +6 -0
    WL#3015: Logging Improvements - No Restarts

  sql/log.h
    1.9 06/04/25 10:24:19 gluh@stripped +3 -0
    WL#3015: Logging Improvements - No Restarts
    added methods to LOGGER class
     void deactivate_log_handlers(THD* thd, uint log_type);
     void activate_log_handlers(THD* thd, uint log_type);

  sql/log.cc
    1.206 06/04/25 10:24:19 gluh@stripped +103 -34
    WL#3015: Logging Improvements - No Restarts
    added methods to LOGGER class
     void deactivate_log_handlers(THD* thd, uint log_type);
     void activate_log_handlers(THD* thd, uint log_type);

  mysql-test/r/show_check.result
    1.94 06/04/25 10:24:19 gluh@stripped +7 -13
    WL#3015: Logging Improvements - No Restarts
    result fix

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	gluh
# Host:	eagle.intranet.mysql.r18.ru
# Root:	/home/gluh/MySQL/Devel/5.1.3015

--- 1.205/sql/log.cc	Tue Apr 18 09:43:01 2006
+++ 1.206/sql/log.cc	Tue Apr 25 10:24:19 2006
@@ -35,9 +35,6 @@
 #define MAX_USER_HOST_SIZE 512
 #define MAX_TIME_SIZE 32
 
-/* we need this for log files intialization */
-extern char *opt_logname, *opt_slow_logname;
-
 LOGGER logger;
 
 MYSQL_LOG mysql_bin_log;
@@ -53,6 +50,13 @@ static int binlog_commit(THD *thd, bool 
 static int binlog_rollback(THD *thd, bool all);
 static int binlog_prepare(THD *thd, bool all);
 
+char *make_log_name(char *buff,const char* log_ext)
+{
+    strmake(buff, glob_hostname, FN_REFLEN-5);
+    strmov(fn_ext(buff), log_ext);
+    return fn_format(buff, buff, mysql_data_home,"",MY_UNPACK_FILENAME);
+}
+
 /*
   This is a POD. Please keep it that way!
 
@@ -276,8 +280,10 @@ bool Log_to_csv_event_handler::reopen_lo
 
 void Log_to_csv_event_handler::cleanup()
 {
-  close_log_table(QUERY_LOG_GENERAL, FALSE);
-  close_log_table(QUERY_LOG_SLOW, FALSE);
+  if (opt_general_log)
+    close_log_table(QUERY_LOG_GENERAL, FALSE);
+  if (opt_slow_query_log)
+    close_log_table(QUERY_LOG_SLOW, FALSE);
   logger.is_log_tables_initialized= FALSE;
 }
 
@@ -530,11 +536,11 @@ bool Log_to_file_event_handler::init()
 {
   if (!is_initialized)
   {
-    if (opt_slow_log)
-      mysql_slow_log.open_slow_log(opt_slow_logname);
+    if (opt_slow_query_log)
+      mysql_slow_log.open_slow_log(sys_var_slow_log_path.value);
 
-    if (opt_log)
-      mysql_log.open_query_log(opt_logname);
+    if (opt_general_log)
+      mysql_log.open_query_log(sys_var_general_log_path.value);
 
     is_initialized= TRUE;
   }
@@ -552,8 +558,10 @@ void Log_to_file_event_handler::cleanup(
 void Log_to_file_event_handler::flush()
 {
   /* reopen log files */
-  mysql_log.new_file(1);
-  mysql_slow_log.new_file(1);
+  if (opt_general_log)
+    mysql_log.new_file(1);
+  if (opt_slow_query_log)
+    mysql_slow_log.new_file(1);
 }
 
 /*
@@ -673,6 +681,12 @@ bool LOGGER::flush_logs(THD *thd)
   close_general_log.db= (char*) "mysql";
   close_general_log.db_length= 5;
 
+  /*
+    Deny others from logging to general and slow log,
+    while reopening tables.
+  */
+  logger.lock();
+
   /* reopen log files */
   file_log_handler->flush();
 
@@ -689,23 +703,18 @@ bool LOGGER::flush_logs(THD *thd)
       Here we use one of the logger handler THD's. Simply because it
       seems appropriate.
     */
-    lock_and_wait_for_table_name(table_log_handler->general_log_thd,
-                                 &close_slow_log);
-    lock_and_wait_for_table_name(table_log_handler->general_log_thd,
-                                 &close_general_log);
-
-    /*
-      Deny others from logging to general and slow log,
-      while reopening tables.
-    */
-    logger.lock();
+    if (opt_slow_query_log)
+      lock_and_wait_for_table_name(table_log_handler->general_log_thd,
+				   &close_slow_log);
+    if (opt_general_log)
+      lock_and_wait_for_table_name(table_log_handler->general_log_thd,
+				   &close_general_log);
 
     table_log_handler->flush(table_log_handler->general_log_thd,
                              &close_slow_log, &close_general_log);
-
-    /* end of log tables flush */
-    logger.unlock();
   }
+  /* end of log flush */
+  logger.unlock();
   return FALSE;
 }
 
@@ -753,6 +762,11 @@ bool LOGGER::slow_log_print(THD *thd, co
       return 0;
 
     lock();
+    if (!opt_slow_query_log)
+    {
+      unlock();
+      return 0;
+    }
 
     /* fill in user_host value: the format is "%s[%s] @ %s [%s]" */
     user_host_len= strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
@@ -827,6 +841,11 @@ bool LOGGER::general_log_print(THD *thd,
       id=0;                                     /* Log from connect handler */
 
     lock();
+    if (!opt_general_log)
+    {
+      unlock();
+      return 0;
+    }
     time_t current_time= time(NULL);
 
     user_host_len= strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
@@ -930,26 +949,76 @@ void LOGGER::init_general_log(uint gener
 }
 
 
+bool LOGGER::activate_log_handlers(THD* thd, uint log_type)
+{
+  bool res= 0;
+  reopen_log_table(log_type);
+  if (log_type == QUERY_LOG_GENERAL)
+  {
+    if ((res= file_log_handler->
+	 mysql_log.open_query_log(sys_var_general_log_path.value)))
+    goto err;
+  }
+  else 
+    res= file_log_handler->
+      mysql_slow_log.open_query_log(sys_var_slow_log_path.value);
+
+err:
+  return res;
+}
+
+
+void LOGGER::deactivate_log_handlers(THD* thd, uint log_type)
+{
+  TABLE_LIST *table_list;
+  if (log_type == QUERY_LOG_GENERAL)
+    table_list= &table_log_handler->general_log;
+  else
+    table_list= &table_log_handler->slow_log;
+  VOID(pthread_mutex_lock(&LOCK_open));
+  close_log_table(log_type, TRUE);
+  query_cache_invalidate3(thd, table_list, 0);
+  unlock_table_name(thd, table_list);
+  VOID(pthread_mutex_unlock(&LOCK_open));
+  if (log_type == QUERY_LOG_GENERAL)
+    file_log_handler->mysql_log.close(LOG_CLOSE_INDEX|LOG_CLOSE_STOP_EVENT);
+  else
+    file_log_handler->mysql_slow_log.close(LOG_CLOSE_INDEX|LOG_CLOSE_STOP_EVENT);
+}
+
+
 bool Log_to_csv_event_handler::flush(THD *thd, TABLE_LIST *close_slow_log,
                                      TABLE_LIST *close_general_log)
 {
   VOID(pthread_mutex_lock(&LOCK_open));
-  close_log_table(QUERY_LOG_GENERAL, TRUE);
-  close_log_table(QUERY_LOG_SLOW, TRUE);
-  close_general_log->next_local= close_slow_log;
-  query_cache_invalidate3(thd, close_general_log, 0);
-  unlock_table_name(thd, close_slow_log);
-  unlock_table_name(thd, close_general_log);
+  if (opt_general_log)
+  {
+    close_log_table(QUERY_LOG_GENERAL, TRUE);
+    query_cache_invalidate3(thd, close_general_log, 0);
+    unlock_table_name(thd, close_general_log);
+  }
+  if (opt_slow_query_log)
+  {
+    close_log_table(QUERY_LOG_SLOW, TRUE);
+    query_cache_invalidate3(thd, close_slow_log, 0);
+    unlock_table_name(thd, close_slow_log);
+  }
   VOID(pthread_mutex_unlock(&LOCK_open));
-  return reopen_log_table(QUERY_LOG_SLOW) ||
-         reopen_log_table(QUERY_LOG_GENERAL);
+
+  if (opt_slow_query_log && reopen_log_table(QUERY_LOG_SLOW) ||
+      opt_general_log && reopen_log_table(QUERY_LOG_GENERAL))
+    return 1;
+  return 0;
 }
 
 /* the parameters are unused for the log tables */
 bool Log_to_csv_event_handler::init()
 {
-  /* we always open log tables. even if the logging is disabled */
-  return (open_log_table(QUERY_LOG_GENERAL) || open_log_table(QUERY_LOG_SLOW));
+  if (opt_general_log && open_log_table(QUERY_LOG_GENERAL))
+    return 1;
+  if (opt_slow_query_log && open_log_table(QUERY_LOG_SLOW))
+    return 1;
+  return 0;
 }
 
 int LOGGER::set_handlers(uint error_log_printer,

--- 1.391/sql/mysql_priv.h	Sun Apr 16 06:17:25 2006
+++ 1.392/sql/mysql_priv.h	Tue Apr 25 10:24:19 2006
@@ -1065,6 +1065,7 @@ bool rename_temporary_table(THD* thd, TA
 void remove_db_from_cache(const char *db);
 void flush_tables();
 bool is_equal(const LEX_STRING *a, const LEX_STRING *b);
+char *make_log_name(char *buff,const char* log_ext);
 
 #ifdef WITH_PARTITION_STORAGE_ENGINE
 uint fast_alter_partition_table(THD *thd, TABLE *table,
@@ -1308,6 +1309,7 @@ extern ulong expire_logs_days, sync_binl
 extern ulong opt_tc_log_size, tc_log_max_pages_used, tc_log_page_size;
 extern ulong tc_log_page_waits;
 extern my_bool relay_log_purge, opt_innodb_safe_binlog, opt_innodb;
+extern my_bool opt_general_log, opt_slow_query_log;
 extern uint test_flags,select_errors,ha_open_options;
 extern uint protocol_version, mysqld_port, dropping_tables;
 extern uint delay_key_write_options, lower_case_table_names;
@@ -1316,6 +1318,7 @@ extern my_bool locked_in_memory;
 extern bool opt_using_transactions, mysqld_embedded;
 extern bool using_update_log, opt_large_files, server_id_supplied;
 extern bool opt_log, opt_update_log, opt_bin_log, opt_slow_log, opt_error_log;
+extern uint log_output_options;
 extern bool opt_disable_networking, opt_skip_show_db;
 extern my_bool opt_character_set_client_handshake;
 extern bool volatile abort_loop, shutdown_in_progress, grant_option;
@@ -1336,6 +1339,8 @@ extern my_bool opt_enable_shared_memory;
 extern char *default_tz_name;
 extern my_bool opt_large_pages;
 extern uint opt_large_page_size;
+extern char *opt_logname, *opt_slow_logname;
+extern const char *log_output_str;
 
 extern MYSQL_LOG mysql_bin_log;
 extern LOGGER logger;
@@ -1380,6 +1385,7 @@ extern TABLE *unused_tables;
 extern const char* any_db;
 extern struct my_option my_long_options[];
 extern const LEX_STRING view_type;
+extern TYPELIB log_output_typelib;
 
 /* optional things, have_* variables */
 

--- 1.556/sql/mysqld.cc	Mon Apr 17 22:06:12 2006
+++ 1.557/sql/mysqld.cc	Tue Apr 25 10:24:19 2006
@@ -302,16 +302,15 @@ arg_cmp_func Arg_comparator::comparator_
  {&Arg_comparator::compare_row,        &Arg_comparator::compare_e_row},
  {&Arg_comparator::compare_decimal,    &Arg_comparator::compare_e_decimal}};
 
-const char *log_output_names[] =
-{ "NONE", "FILE", "TABLE", NullS};
+const char *log_output_names[] = { "NONE", "FILE", "TABLE", NullS};
+static const unsigned int log_output_names_len[]= { 4, 4, 5, 0 };
 TYPELIB log_output_typelib= {array_elements(log_output_names)-1,"",
-				 log_output_names, NULL};
+			     log_output_names, 
+			     (unsigned int *) log_output_names_len};
 
 /* static variables */
 
 /* the default log output is log tables */
-static const char *log_output_str= "TABLE";
-static ulong log_output_options= LOG_TABLE;
 static bool lower_case_table_names_used= 0;
 static bool volatile select_thread_in_use, signal_thread_in_use;
 static bool volatile ready_to_exit;
@@ -344,6 +343,7 @@ static my_bool opt_sync_bdb_logs;
 /* Global variables */
 
 bool opt_log, opt_update_log, opt_bin_log, opt_slow_log;
+uint log_output_options;
 bool opt_error_log= IF_WIN(1,0);
 bool opt_disable_networking=0, opt_skip_show_db=0;
 my_bool opt_character_set_client_handshake= 1;
@@ -362,6 +362,7 @@ my_bool opt_safe_user_create = 0, opt_no
 my_bool opt_show_slave_auth_info, opt_sql_bin_update = 0;
 my_bool opt_log_slave_updates= 0;
 my_bool	opt_innodb;
+my_bool opt_general_log, opt_slow_query_log;
 #ifdef WITH_INNOBASE_STORAGE_ENGINE
 extern SHOW_VAR innodb_status_variables[];
 extern uint innobase_init_flags, innobase_lock_type;
@@ -504,6 +505,7 @@ ulong thread_id=1L,current_pid;
 ulong slow_launch_threads = 0, sync_binlog_period;
 ulong expire_logs_days = 0;
 ulong rpl_recovery_rank=0;
+const char *log_output_str= "TABLE";
 
 double log_10[32];			/* 10 potences */
 time_t start_time;
@@ -1180,6 +1182,8 @@ void clean_up(bool print_message)
     free_defaults(defaults_argv);
   my_free(sys_init_connect.value, MYF(MY_ALLOW_ZERO_PTR));
   my_free(sys_init_slave.value, MYF(MY_ALLOW_ZERO_PTR));
+  my_free(sys_var_general_log_path.value, MYF(MY_ALLOW_ZERO_PTR));
+  my_free(sys_var_slow_log_path.value, MYF(MY_ALLOW_ZERO_PTR));
   free_tmpdir(&mysql_tmpdir_list);
 #ifdef HAVE_REPLICATION
   my_free(slave_load_tmpdir,MYF(MY_ALLOW_ZERO_PTR));
@@ -2568,6 +2572,7 @@ static bool init_global_datetime_format(
 static int init_common_variables(const char *conf_file_name, int argc,
 				 char **argv, const char **groups)
 {
+  char buff[FN_REFLEN];
   umask(((~my_umask) & 0666));
   my_decimal_set_zero(&decimal_zero); // set decimal_zero constant;
   tzset();			// Set tzname
@@ -2736,6 +2741,22 @@ static int init_common_variables(const c
   else
     sys_init_slave.value=my_strdup("",MYF(0));
 
+  if(opt_log)
+  {
+    if (!opt_logname)
+      opt_logname= make_log_name(buff, ".log");
+    sys_var_general_log_path.value= my_strdup(opt_logname, MYF(0));
+    sys_var_general_log_path.value_length= strlen(opt_logname);
+  }
+
+  if(opt_slow_log)
+  {
+    if (!opt_slow_logname)
+      opt_slow_logname= make_log_name(buff, "-slow.log");
+    sys_var_slow_log_path.value= my_strdup(opt_slow_logname, MYF(0));
+    sys_var_slow_log_path.value_length= strlen(opt_slow_logname);
+  }
+
   if (use_temp_pool && bitmap_init(&temp_pool,0,1024,1))
     return 1;
   if (my_database_names_init())
@@ -4724,7 +4745,9 @@ enum options_mysqld
   OPT_TABLE_LOCK_WAIT_TIMEOUT,
   OPT_PLUGIN_DIR,
   OPT_LOG_OUTPUT,
-  OPT_PORT_OPEN_TIMEOUT
+  OPT_PORT_OPEN_TIMEOUT,
+  OPT_GENERAL_LOG,
+  OPT_SLOW_LOG
 };
 
 
@@ -4960,6 +4983,9 @@ Disable with --skip-bdb (will save memor
    "Set up signals usable for debugging",
    (gptr*) &opt_debugging, (gptr*) &opt_debugging,
    0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+  {"general-log", OPT_GENERAL_LOG,
+   "Enable|disable general log", (gptr*) &opt_general_log,
+   (gptr*) &opt_general_log, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0},
 #ifdef HAVE_LARGE_PAGES
   {"large-pages", OPT_ENABLE_LARGE_PAGES, "Enable support for large pages. \
 Disable with --skip-large-pages.",
@@ -5529,6 +5555,9 @@ replicating a LOAD DATA INFILE command."
    "Tells the slave thread to continue replication when a query returns an error from the
provided list.",
    0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 #endif
+  {"slow-query-log", OPT_SLOW_LOG,
+   "Enable|disable slow query log", (gptr*) &opt_slow_query_log,
+   (gptr*) &opt_slow_query_log, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0},
   {"socket", OPT_SOCKET, "Socket file to use for connection.",
    (gptr*) &mysqld_unix_port, (gptr*) &mysqld_unix_port, 0, GET_STR,
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -6851,7 +6880,9 @@ static void mysql_init_variables(void)
   /* Things reset to zero */
   opt_skip_slave_start= opt_reckless_slave = 0;
   mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
+  opt_general_log= opt_slow_query_log= 1;
   opt_log= opt_update_log= opt_slow_log= 0;
+  log_output_options= LOG_TABLE;
   opt_bin_log= 0;
   opt_disable_networking= opt_skip_show_db=0;
   opt_logname= opt_update_logname= opt_binlog_index_name= opt_slow_logname= 0;
@@ -7797,6 +7828,10 @@ static void get_options(int argc,char **
 				  &global_system_variables.datetime_format))
     exit(1);
 
+  if (!opt_log && opt_general_log)
+    opt_general_log= 0;
+  if (!opt_slow_log && opt_slow_query_log)
+    opt_slow_query_log= 0;
 }
 
 

--- 1.180/sql/sql_delete.cc	Tue Apr 11 15:15:49 2006
+++ 1.181/sql/sql_delete.cc	Tue Apr 25 10:24:20 2006
@@ -930,7 +930,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST
     {
       lock_logger= 1;
       logger.lock();
-      logger.close_log_table(QUERY_LOG_GENERAL, FALSE);
+      if (opt_general_log)
+	logger.close_log_table(QUERY_LOG_GENERAL, FALSE);
       closed_log_tables= closed_log_tables | QUERY_LOG_GENERAL;
     }
     else
@@ -939,7 +940,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST
       {
         lock_logger= 1;
         logger.lock();
-        logger.close_log_table(QUERY_LOG_SLOW, FALSE);
+	if (opt_slow_query_log)
+	  logger.close_log_table(QUERY_LOG_SLOW, FALSE);
         closed_log_tables= closed_log_tables | QUERY_LOG_SLOW;
       }
   }
@@ -973,10 +975,10 @@ end:
     unlock_table_name(thd, table_list);
     VOID(pthread_mutex_unlock(&LOCK_open));
 
-    if (closed_log_tables & QUERY_LOG_SLOW)
+    if (opt_slow_query_log && (closed_log_tables & QUERY_LOG_SLOW))
       logger.reopen_log_table(QUERY_LOG_SLOW);
 
-    if (closed_log_tables & QUERY_LOG_GENERAL)
+    if (opt_general_log && (closed_log_tables & QUERY_LOG_GENERAL))
       logger.reopen_log_table(QUERY_LOG_GENERAL);
     if (lock_logger)
       logger.unlock();

--- 1.92/sql/share/errmsg.txt	Sat Apr 15 02:48:23 2006
+++ 1.93/sql/share/errmsg.txt	Tue Apr 25 10:24:20 2006
@@ -5832,3 +5832,5 @@ ER_NULL_IN_VALUES_LESS_THAN
 ER_WRONG_PARTITION_NAME
         eng "Incorrect partition name"
         swe "Felaktigt partitionsnamn"
+ER_CANT_CHANGE_LOG_VAR
+        eng "'%-.64s' is disabled. Cannot change '%-.64s' variable."
--- New file ---
+++ mysql-test/r/log_state.result	06/04/25 10:24:20
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';
Variable_name	Value
general_log	OFF
log	ON
log_slow_queries	ON
slow_query_log	OFF
flush logs;
set global general_log= ON;
create table t1(f1 int);
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
TIMESTAMP	root[root] @ localhost []	1	1	Query	create table t1(f1 int)
TIMESTAMP	root[root] @ localhost []	1	1	Query	select * from mysql.general_log
set global general_log= OFF;
drop table t1;
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
TIMESTAMP	root[root] @ localhost []	1	1	Query	create table t1(f1 int)
TIMESTAMP	root[root] @ localhost []	1	1	Query	select * from mysql.general_log
TIMESTAMP	root[root] @ localhost []	1	1	Query	set global general_log= OFF
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';
Variable_name	Value
general_log	ON
log	ON
log_slow_queries	ON
slow_query_log	OFF
set session long_query_time=1;
select sleep(2);
sleep(2)
0
select * from mysql.slow_log;
start_time	user_host	query_time	lock_time	rows_sent	rows_examined	db	last_insert_id	insert_id	server_id	sql_text
set global slow_query_log= ON;
set session long_query_time=1;
select sleep(2);
sleep(2)
0
select * from mysql.slow_log;
start_time	user_host	query_time	lock_time	rows_sent	rows_examined	db	last_insert_id	insert_id	server_id	sql_text
TIMESTAMP,	root[root] @ localhost []	USER_HOST,	QUERY_TIME	1	0	test	0	0	1	select sleep(2)
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name	Value
general_log	ON
log	ON
log_slow_queries	ON
slow_query_log	ON
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;
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
TIMESTAMP	root[root] @ localhost []	1	1	Query	create table t1(f1 int)
TIMESTAMP	root[root] @ localhost []	1	1	Query	drop table t1
TIMESTAMP	root[root] @ localhost []	1	1	Query	select * from mysql.general_log
set global general_log= OFF;
truncate table mysql.general_log;
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
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';
Variable_name	Value
general_log	ON
log	ON
log_slow_queries	ON
slow_query_log	OFF
show variables like 'log_path';
Variable_name	Value
log_path	#
show variables like 'log_slow_queries_path';
Variable_name	Value
log_slow_queries_path	#
show variables like 'log_output';
Variable_name	Value
log_output	FILE,TABLE
set global log_path='/not exiting path/log.master';
ERROR 42000: Variable 'log_path' can't be set to the value of '/not exiting
path/log.master'
show variables like 'log_path';
Variable_name	Value
log_path	#
set global general_log= OFF;
set global log_path='/tmp/log.master';
set global general_log= ON;
create table t1(f1 int);
drop table t1;
set global general_log= OFF;
set global log_path=default;
set global general_log= ON;
create table t1(f1 int);
drop table t1;
show variables like 'log_path';
Variable_name	Value
log_path	#
show variables like 'log_slow_queries_path';
Variable_name	Value
log_slow_queries_path	#
set global general_log= default;
set global slow_query_log= default;
set global log_path=default;
set global log_slow_queries_path= default;
show variables like 'general_log';
Variable_name	Value
general_log	OFF
show variables like 'slow_query_log';
Variable_name	Value
slow_query_log	OFF
set global general_log=ON;
set global log_output=default;
Warnings:
Error	1231	Variable 'log_output' can't be set to the value of 'DEFAULT'
set global general_log=OFF;
set global log_output=FILE;
truncate table mysql.general_log;
show variables like 'log_output';
Variable_name	Value
log_output	FILE
set global general_log=ON;
create table t1(f1 int);
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
set global general_log=OFF;
set global log_output="FILE,TABLE";
show variables like 'log_output';
Variable_name	Value
log_output	FILE,TABLE
set global general_log=ON;
drop table t1;
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
TIMESTAMP	root[root] @ localhost []	1	1	Query	drop table t1
TIMESTAMP	root[root] @ localhost []	1	1	Query	select * from mysql.general_log

--- New file ---
+++ mysql-test/t/log_state-master.opt	06/04/25 10:24:21
--log-output=TABLE,FILE --log --general-log=0 --log-slow-queries --slow-query-log=0

--- New file ---
+++ mysql-test/t/log_state.test	06/04/25 10:24:21
-- source include/not_embedded.inc
--source include/have_csv.inc

--disable_ps_protocol
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
select * from mysql.general_log;
set global general_log= OFF;
drop table t1;
--replace_column 1 TIMESTAMP
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';

connect (con1,localhost,root,,);
connection con1;
set session long_query_time=1;
select sleep(2);
--replace_column 1 TIMESTAMP, 3 USER_HOST, 4 QUERY_TIME
select * from mysql.slow_log;
connection default;

set global slow_query_log= ON;
connection con1;
set session long_query_time=1;
select sleep(2);
--replace_column 1 TIMESTAMP, 3 USER_HOST, 4 QUERY_TIME
select * from mysql.slow_log;
disconnect con1;
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
select * from mysql.general_log;
set global general_log= OFF;
truncate table mysql.general_log;
--replace_column 1 TIMESTAMP
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 'log_path';
--replace_column 2 #
show variables like 'log_slow_queries_path';
show variables like 'log_output';

--error 1231
set global log_path='/not exiting path/log.master';
--replace_column 2 #
show variables like 'log_path';
set global general_log= OFF;
set global log_path='/tmp/log.master';
set global general_log= ON;
create table t1(f1 int);
drop table t1;
set global general_log= OFF;
set global log_path=default;
set global general_log= ON;
create table t1(f1 int);
drop table t1;
--replace_column 2 #
show variables like 'log_path';
--replace_column 2 #
show variables like 'log_slow_queries_path';

set global general_log= default;
set global slow_query_log= default;
set global log_path=default;
set global log_slow_queries_path= default;
show variables like 'general_log';
show variables like 'slow_query_log';
set global general_log=ON;
set global log_output=default;
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
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
select * from mysql.general_log;

--enable_ps_protocol


--- 1.8/sql/log.h	Wed Mar 29 16:27:31 2006
+++ 1.9/sql/log.h	Tue Apr 25 10:24:19 2006
@@ -416,6 +416,7 @@ public:
 
 class Log_to_file_event_handler: public Log_event_handler
 {
+  friend class LOGGER;
   MYSQL_LOG mysql_log, mysql_slow_log;
   bool is_initialized;
 public:
@@ -510,6 +511,8 @@ public:
   void init_error_log(uint error_log_printer);
   void init_slow_log(uint slow_log_printer);
   void init_general_log(uint general_log_printer);
+  void deactivate_log_handlers(THD* thd, uint log_type);
+  bool activate_log_handlers(THD* thd, uint log_type);
  };
 
 

--- 1.93/mysql-test/r/show_check.result	Mon Mar  6 14:35:33 2006
+++ 1.94/mysql-test/r/show_check.result	Tue Apr 25 10:24:19 2006
@@ -148,14 +148,12 @@ flush tables;
 show open tables;
 Database	Table	In_use	Name_locked
 mysql	general_log	1	0
-mysql	slow_log	1	0
 create table t1(n int);
 insert into t1 values (1);
 show open tables;
 Database	Table	In_use	Name_locked
-mysql	general_log	1	0
-mysql	slow_log	1	0
 test	t1	0	0
+mysql	general_log	1	0
 drop table t1;
 create table t1 (a int not null, b VARCHAR(10), INDEX (b) ) AVG_ROW_LENGTH=10 CHECKSUM=1
COMMENT="test" ENGINE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1
ROW_FORMAT=fixed;
 show create table t1;
@@ -568,23 +566,21 @@ SELECT 1 FROM mysql.db, mysql.proc, mysq
 1
 SHOW OPEN TABLES;
 Database	Table	In_use	Name_locked
-mysql	proc	0	0
+mysql	db	0	0
 test	urkunde	0	0
 mysql	time_zone	0	0
-mysql	db	0	0
+mysql	general_log	1	0
 test	txt1	0	0
-mysql	slow_log	1	0
+mysql	proc	0	0
 test	tyt2	0	0
-mysql	general_log	1	0
 mysql	user	0	0
 mysql	time_zone_name	0	0
 SHOW OPEN TABLES FROM mysql;
 Database	Table	In_use	Name_locked
-mysql	proc	0	0
-mysql	time_zone	0	0
 mysql	db	0	0
-mysql	slow_log	1	0
+mysql	time_zone	0	0
 mysql	general_log	1	0
+mysql	proc	0	0
 mysql	user	0	0
 mysql	time_zone_name	0	0
 SHOW OPEN TABLES FROM mysql LIKE 'u%';
@@ -598,16 +594,14 @@ test	tyt2	0	0
 mysql	time_zone_name	0	0
 SHOW OPEN TABLES LIKE '%o%';
 Database	Table	In_use	Name_locked
-mysql	proc	0	0
 mysql	time_zone	0	0
-mysql	slow_log	1	0
 mysql	general_log	1	0
+mysql	proc	0	0
 mysql	time_zone_name	0	0
 FLUSH TABLES;
 SHOW OPEN TABLES;
 Database	Table	In_use	Name_locked
 mysql	general_log	1	0
-mysql	slow_log	1	0
 DROP TABLE txt1;
 DROP TABLE tyt2;
 DROP TABLE urkunde;

--- 1.181/sql/set_var.cc	Wed Mar 29 16:27:31 2006
+++ 1.182/sql/set_var.cc	Tue Apr 25 10:24:20 2006
@@ -161,7 +161,11 @@ static KEY_CACHE *create_key_cache(const
 void fix_sql_mode_var(THD *thd, enum_var_type type);
 static byte *get_error_count(THD *thd);
 static byte *get_warning_count(THD *thd);
-
+static int  sys_check_log_path(THD *thd,  set_var *var);
+static bool sys_update_general_log_path(THD *thd, set_var * var);
+static void sys_default_general_log_path(THD *thd, enum_var_type type);
+static bool sys_update_slow_log_path(THD *thd, set_var * var);
+static void sys_default_slow_log_path(THD *thd, enum_var_type type);
 /*
   Variable definition list
 
@@ -649,6 +653,23 @@ sys_var_have_variable sys_have_row_based
 /* Global read-only variable describing server license */
 sys_var_const_str		sys_license("license", STRINGIFY_ARG(LICENSE));
 
+/* Global variables which enable|disable logging */
+sys_var_log_state sys_var_general_log("general_log", &opt_general_log,
QUERY_LOG_GENERAL);
+sys_var_log_state sys_var_slow_query_log("slow_query_log", &opt_slow_query_log,
QUERY_LOG_SLOW);
+
+sys_var_str sys_var_general_log_path("log_path", sys_check_log_path,
+				     sys_update_general_log_path,
+				     sys_default_general_log_path,
+				     opt_logname);
+sys_var_str sys_var_slow_log_path("log_slow_queries_path", sys_check_log_path,
+				  sys_update_slow_log_path, 
+				  sys_default_slow_log_path,
+				  opt_slow_logname);
+sys_var_log_output sys_var_log_output_state("log_output", &log_output_options,
+					    &log_output_typelib, 0);
+
+
+
 #ifdef HAVE_REPLICATION
 static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff)
 {
@@ -748,6 +769,7 @@ SHOW_VAR init_vars[]= {
   {"ft_min_word_len",         (char*) &ft_min_word_len,             SHOW_LONG},
   {"ft_query_expansion_limit",(char*) &ft_query_expansion_limit,    SHOW_LONG},
   {"ft_stopword_file",        (char*) &ft_stopword_file,            SHOW_CHAR_PTR},
+  {sys_var_general_log.name, (char*) &opt_general_log,              SHOW_MY_BOOL},
   {sys_group_concat_max_len.name, (char*) &sys_group_concat_max_len,  SHOW_SYS},
   {sys_have_archive_db.name,  (char*) &have_archive_db,             SHOW_HAVE},
   {sys_have_berkeley_db.name, (char*) &have_berkeley_db,            SHOW_HAVE},
@@ -825,10 +847,13 @@ SHOW_VAR init_vars[]= {
   {"log_bin",                 (char*) &opt_bin_log,                 SHOW_BOOL},
   {sys_trust_function_creators.name,(char*) &sys_trust_function_creators, SHOW_SYS},
   {"log_error",               (char*) log_error_file,               SHOW_CHAR},
+  {sys_var_log_output_state.name, (char*) &sys_var_log_output_state, SHOW_SYS},
+  {sys_var_general_log_path.name, (char*) &sys_var_general_log_path, SHOW_SYS},
 #ifdef HAVE_REPLICATION
   {"log_slave_updates",       (char*) &opt_log_slave_updates,       SHOW_MY_BOOL},
 #endif
   {"log_slow_queries",        (char*) &opt_slow_log,                SHOW_BOOL},
+  {sys_var_slow_log_path.name, (char*) &sys_var_slow_log_path,      SHOW_SYS},
   {sys_log_warnings.name,     (char*) &sys_log_warnings,	    SHOW_SYS},
   {sys_long_query_time.name,  (char*) &sys_long_query_time, 	    SHOW_SYS},
   {sys_low_priority_updates.name, (char*) &sys_low_priority_updates, SHOW_SYS},
@@ -943,6 +968,7 @@ SHOW_VAR init_vars[]= {
   {sys_slave_trans_retries.name,(char*) &sys_slave_trans_retries,   SHOW_SYS},
 #endif
   {sys_slow_launch_time.name, (char*) &sys_slow_launch_time,        SHOW_SYS},
+  {sys_var_slow_query_log.name, (char*) &opt_slow_query_log,        SHOW_MY_BOOL},
 #ifdef HAVE_SYS_UN_H
   {"socket",                  (char*) &mysqld_unix_port,             SHOW_CHAR_PTR},
 #endif
@@ -2455,6 +2481,223 @@ bool sys_var_key_cache_long::update(THD 
 end:
   pthread_mutex_unlock(&LOCK_global_system_variables);
   return error;
+}
+
+
+bool sys_var_log_state::check(THD *thd, set_var *var)
+{
+  if ((log_type == QUERY_LOG_SLOW && !opt_slow_log) ||
+      (log_type == QUERY_LOG_GENERAL && !opt_log))
+  {
+    my_error(ER_CANT_CHANGE_LOG_VAR, MYF(0),
+             log_type == QUERY_LOG_SLOW ? "SLOW QUERY LOG" : "GENERAL LOG",
+	     name);
+    return 1;    // log disabled, can not update variable
+  }
+  return check_enum(thd, var, &bool_typelib);
+}
+
+
+bool sys_var_log_state::update(THD *thd, set_var *var)
+{
+  bool res= 0;
+  my_bool tmp_val= (my_bool) var->save_result.ulong_value;
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  logger.lock();
+  if (*value == tmp_val)
+    goto end;
+  if (!tmp_val)
+    logger.deactivate_log_handlers(thd, log_type);
+  else
+  {
+    if ((res= logger.activate_log_handlers(thd, log_type)))
+    {
+      my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
+	       var->value->str_value.ptr());
+      goto end;
+    }
+  }
+  *value= (my_bool) tmp_val;
+
+end:
+  logger.unlock();
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+  return res;
+}
+
+void sys_var_log_state::set_default(THD *thd, enum_var_type type)
+{
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  logger.lock();
+  if (*value)
+    logger.deactivate_log_handlers(thd, log_type);
+  *value= (my_bool) 0;
+  logger.unlock();
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+}
+
+
+
+
+static int  sys_check_log_path(THD *thd,  set_var *var)
+{
+  char path[FN_REFLEN];
+  uint path_len= dirname_part(path, var->value->str_value.ptr());
+
+  if (path_len == var->value->str_value.length() || 
+      path_len &&  my_access(path, (F_OK|W_OK)))
+    return -1;
+  return 0;
+}
+
+
+bool update_sys_var_str_path(THD *thd, sys_var_str *var_str,
+			     set_var *var, const char *log_ext,
+			     bool log_type)
+{
+  char buff[FN_REFLEN];
+  char *res= 0, *old_value=(char *)(var ? var->value->str_value.ptr() : 0);
+  bool result= 0;
+  uint new_length= (var ? var->value->str_value.length() : 0);
+
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  logger.lock();
+  if (log_type)
+  {
+    my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var_str->name, 
+	     old_value ? old_value : "DEFAULT");
+    result= 1;
+    goto err;
+  }
+
+  if (!old_value)
+  {
+    old_value= make_log_name(buff, log_ext);
+    new_length= strlen(old_value);
+  }
+
+  if (!(res= my_strndup((byte*)old_value, new_length, MYF(0))))
+  {
+    my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var_str->name,
+	     old_value ? old_value : "DEFAULT");;
+    result= 1;
+    goto err;
+  }
+
+  old_value= var_str->value;
+  var_str->value= res;
+  var_str->value_length= new_length;
+  my_free(old_value, MYF(MY_ALLOW_ZERO_PTR));
+err:
+  logger.unlock();
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+  return result;
+}
+
+
+static bool sys_update_general_log_path(THD *thd, set_var * var)
+{
+  return update_sys_var_str_path(thd, &sys_var_general_log_path, 
+				 var, ".log", opt_general_log);
+}
+
+
+static void sys_default_general_log_path(THD *thd, enum_var_type type)
+{
+  (void) update_sys_var_str_path(thd, &sys_var_general_log_path,
+				 0, ".log", opt_general_log);
+}
+
+
+static bool sys_update_slow_log_path(THD *thd, set_var * var)
+{
+  return update_sys_var_str_path(thd, &sys_var_slow_log_path,
+				 var, "-slow.log", opt_slow_query_log);
+}
+
+
+static void sys_default_slow_log_path(THD *thd, enum_var_type type)
+{
+  (void) update_sys_var_str_path(thd, &sys_var_slow_log_path,
+				 0, "-slow.log", opt_slow_query_log);
+}
+
+
+bool sys_var_log_output::check(THD *thd, set_var *var)
+{
+  if (!opt_slow_log && !opt_log)
+  {
+    my_error(ER_CANT_CHANGE_LOG_VAR, MYF(0),
+	     "LOGGING", name);
+    return 1;
+  }
+  return check_set(thd, var, enum_names);
+}
+
+
+bool sys_var_log_output::update(THD *thd, set_var *var)
+{
+  bool res= 0;
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  logger.lock();
+  if (opt_general_log || opt_slow_query_log)
+  {
+    my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
+	     var->value->str_value.ptr());
+    res= 1;
+    goto err;
+  }
+
+  logger.init_slow_log(var->save_result.ulong_value);
+  logger.init_general_log(var->save_result.ulong_value);
+  *value= var->save_result.ulong_value;
+
+err:
+  logger.unlock();
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+  return res;
+}
+
+
+void sys_var_log_output::set_default(THD *thd, enum_var_type type)
+{
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  logger.lock();
+  if (opt_general_log || opt_slow_query_log)
+    my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
+	     "DEFAULT");
+  else
+  {
+    logger.init_slow_log(LOG_TABLE);
+    logger.init_general_log(LOG_TABLE);
+    *value= LOG_TABLE;
+  }
+  logger.unlock();
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+}
+
+
+byte *sys_var_log_output::value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
+{
+  char buff[256];
+  String tmp(buff, sizeof(buff), &my_charset_latin1);
+  ulong length;
+  ulong val= *value;
+
+  tmp.length(0);
+  for (uint i= 0; val; val>>= 1, i++)
+  {
+    if (val & 1)
+    {
+      tmp.append(log_output_typelib.type_names[i],
+                 log_output_typelib.type_lengths[i]);
+      tmp.append(',');
+    }
+  }
+
+  if ((length= tmp.length()))
+    length--;
+  return (byte*) thd->strmake(tmp.ptr(), length);
 }
 
 

--- 1.84/sql/set_var.h	Sun Feb 26 01:20:53 2006
+++ 1.85/sql/set_var.h	Tue Apr 25 10:24:20 2006
@@ -205,9 +205,9 @@ public:
 
 class sys_var_enum :public sys_var
 {
-  uint	*value; 
-  TYPELIB *enum_names;
 public:
+  TYPELIB *enum_names;
+  uint	*value;
   sys_var_enum(const char *name_arg, uint *value_arg,
 	       TYPELIB *typelib, sys_after_update_func func)
     :sys_var(name_arg,func), value(value_arg), enum_names(typelib)
@@ -718,6 +718,32 @@ public:
 };
 
 
+class sys_var_log_state :public sys_var_bool_ptr
+{
+  uint log_type;
+public:
+  sys_var_log_state(const char *name_arg, my_bool *value_arg, uint log_type_arg)
+    :sys_var_bool_ptr(name_arg, value_arg), log_type(log_type_arg) {}
+  bool check(THD *thd, set_var *var);
+  bool update(THD *thd, set_var *var);
+  void set_default(THD *thd, enum_var_type type);
+};
+
+
+class sys_var_log_output :public sys_var_enum
+{
+public:
+  sys_var_log_output(const char *name_arg, uint *value_arg,
+		     TYPELIB *typelib, sys_after_update_func func)
+    :sys_var_enum(name_arg, value_arg, typelib, func)
+  {}
+  bool check(THD *thd, set_var *var);
+  bool update(THD *thd, set_var *var);
+  byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
+  void set_default(THD *thd, enum_var_type type);
+};
+
+
 /* Variable that you can only read from */
 
 class sys_var_readonly: public sys_var
@@ -1012,6 +1038,8 @@ extern sys_var_thd_bit sys_autocommit;
 CHARSET_INFO *get_old_charset_by_name(const char *old_name);
 gptr find_named(I_List<NAMED_LIST> *list, const char *name, uint length,
 		NAMED_LIST **found);
+
+extern sys_var_str sys_var_general_log_path, sys_var_slow_log_path;
 
 /* key_cache functions */
 KEY_CACHE *get_key_cache(LEX_STRING *cache_name);
Thread
bk commit into 5.1 tree (gluh:1.2362)gluh25 Apr