List:Commits« Previous MessageNext Message »
From:Marc Alff Date:November 17 2008 7:13pm
Subject:Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234
View as plain text  
Hi Ingo and All

Good work,
please see some comments below.

Regards,
-- Marc


Ingo Struewing wrote:
> #At file:///home/mydev/bzrroot/mysql-5.1-bug28234/
> 
>  2751 Ingo Struewing	2008-10-04
>       Bug#28234 - global/session scope - documentation vs implementation
>       
>       Several system variables did not behave like system variables should do.
>       When trying to SET them or use them in SELECT, they were reported as
>       "unknown system variable". But they appeared in SHOW VARIABLES.
>       
>       This has been fixed by removing the "fixed_vars" array of variables
>       and integrating the variables into the normal system variables chain.
>       All of these variables do now behave as read-only global-only
>       variables. Trying to SET them tells they are read-only, trying to
>       SELECT the session value tells they are global only. Selecting the
>       global value works. It delivers the same value as SHOW VARIABLES.
> modified:
>   mysql-test/r/variables-notembedded.result
>   mysql-test/r/variables.result
>   mysql-test/t/variables-notembedded.test
>   mysql-test/t/variables.test
>   sql/set_var.cc
>   sql/set_var.h
>   sql/sql_repl.cc
>   sql/sql_show.cc
> 
> per-file messages:
>   mysql-test/r/variables-notembedded.result
>     Bug#28234 - global/session scope - documentation vs implementation
>     New test result.
>   mysql-test/r/variables.result
>     Bug#28234 - global/session scope - documentation vs implementation
>     New test result.
>   mysql-test/t/variables-notembedded.test
>     Bug#28234 - global/session scope - documentation vs implementation
>     Added a test for each moved variable that is not present in an
>     embedded server.
>   mysql-test/t/variables.test
>     Bug#28234 - global/session scope - documentation vs implementation
>     Added a test for each moved variable that is also present in an
>     embedded server.
>   sql/set_var.cc
>     Bug#28234 - global/session scope - documentation vs implementation
>     Moved all variables from the "fixed_vars" array into the normal
>     system variables chain by using the new variable class sys_var_const.
>     Extended sys_var::item() by SHOW_BOOL and SHOW_FUNC.
>     Removed the fixed_show_vars array and its initialization in
>     enumerate_sys_vars().
>     Removed mysql_append_static_vars(), which added fixed_vars arrays
>     to the fixed_show_vars array.
>   sql/set_var.h
>     Bug#28234 - global/session scope - documentation vs implementation
>     Added the new system variable class sys_var_const.
>     Removed declaration of mysql_append_static_vars().
>   sql/sql_repl.cc
>     Bug#28234 - global/session scope - documentation vs implementation
>     Moved all variables from the "fixed_vars" array into the normal
>     system variables chain by using the new variable class sys_var_const.
>     Extended sys_var::item() by SHOW_BOOL and SHOW_FUNC.
>     Moved the declaration of show_slave_skip_errors() up to be before
>     its new usage.
>     Removed the call to mysql_append_static_vars().
>   sql/sql_show.cc
>     Bug#28234 - global/session scope - documentation vs implementation
>     Fixed show_status_array() so that it can handle system variables
>     of SHOW_FUNC type.
> === modified file 'mysql-test/r/variables-notembedded.result'
> --- a/mysql-test/r/variables-notembedded.result	2008-02-15 12:54:04 +0000
> +++ b/mysql-test/r/variables-notembedded.result	2008-10-04 19:21:39 +0000
> @@ -15,3 +15,95 @@ slave_skip_errors	3,100,137,643,1752
>  ---- Clean Up ----
>  set global slave_net_timeout=default;
>  set global sql_slave_skip_counter= 0;
> +
> +#
> +SHOW VARIABLES like 'log_slave_updates';
> +Variable_name	Value
> +log_slave_updates	OFF

Ok

> +SELECT @@session.log_slave_updates;
> +ERROR HY000: Variable 'log_slave_updates' is a GLOBAL variable

Ok

> +SELECT @@global.log_slave_updates;
> +@@global.log_slave_updates
> +0

Ok

> +SET @@session.log_slave_updates= true;
> +ERROR HY000: Variable 'log_slave_updates' is a read only variable

I don't agree here.
This error message is confusing, since by saying that the server 
implicitly agreed that a variable named "@@session.log_slave_updates" 
does exist, which is not the case.

I would much rather prefer the following error instead:
ERROR HY000: Variable 'log_slave_updates' is a GLOBAL variable

I did not look at the code to fix this, I assume it's only a matter of 
changing the order of tests.

Please investigate.

> +SET @@global.log_slave_updates= true;
> +ERROR HY000: Variable 'log_slave_updates' is a read only variable

Ok

> +#

(...)

> 
> === modified file 'mysql-test/r/variables.result'
> --- a/mysql-test/r/variables.result	2008-03-28 15:10:04 +0000
> +++ b/mysql-test/r/variables.result	2008-10-04 19:21:39 +0000
> @@ -1024,3 +1024,342 @@ SET GLOBAL log_output = 0;
>  ERROR 42000: Variable 'log_output' can't be set to the value of '0'
>  
>  # -- End of Bug#34820.
> +

(...)


> 
> === modified file 'mysql-test/t/variables-notembedded.test'
> --- a/mysql-test/t/variables-notembedded.test	2008-02-15 12:54:04 +0000
> +++ b/mysql-test/t/variables-notembedded.test	2008-10-04 19:21:39 +0000
> @@ -28,3 +28,83 @@ set global slave_net_timeout=default;
>  # sql_slave_skip_counter is write-only, so we can't save previous
>  # value and restore it here.  That's ok, because it's normally 0.
>  set global sql_slave_skip_counter= 0;
> +
> +#
> +# Bug#28234 - global/session scope - documentation vs implementation
> +#
> +--echo
> +#
> +# Additional variables fixed from sql_repl.cc.
> +#
> +--echo #
> +SHOW VARIABLES like 'log_slave_updates';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.log_slave_updates;
> +SELECT @@global.log_slave_updates;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.log_slave_updates= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.log_slave_updates= true;
> +#
> +--echo #
> +SHOW VARIABLES like 'relay_log';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.relay_log;
> +SELECT @@global.relay_log;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.relay_log= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.relay_log= 'x';
> +#
> +--echo #
> +SHOW VARIABLES like 'relay_log_index';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.relay_log_index;
> +SELECT @@global.relay_log_index;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.relay_log_index= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.relay_log_index= 'x';
> +#
> +--echo #
> +SHOW VARIABLES like 'relay_log_info_file';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.relay_log_info_file;
> +SELECT @@global.relay_log_info_file;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.relay_log_info_file= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.relay_log_info_file= 'x';
> +#
> +--echo #
> +SHOW VARIABLES like 'relay_log_space_limit';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.relay_log_space_limit;
> +SELECT @@global.relay_log_space_limit;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.relay_log_space_limit= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.relay_log_space_limit= 7;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'slave_load_tmpdir';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.slave_load_tmpdir;
> +--replace_column 1 #
> +SELECT @@global.slave_load_tmpdir;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.slave_load_tmpdir= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.slave_load_tmpdir= 'x';
> +#
> +--echo #
> +SHOW VARIABLES like 'slave_skip_errors';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.slave_skip_errors;
> +SELECT @@global.slave_skip_errors;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.slave_skip_errors= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.slave_skip_errors= 7;
> +#
> 
> === modified file 'mysql-test/t/variables.test'
> --- a/mysql-test/t/variables.test	2008-03-28 15:10:04 +0000
> +++ b/mysql-test/t/variables.test	2008-10-04 19:21:39 +0000
> @@ -795,3 +795,362 @@ SET GLOBAL log_output = 0;
>  --echo
>  --echo # -- End of Bug#34820.
>  
> +#
> +# Bug#28234 - global/session scope - documentation vs implementation
> +#
> +--echo
> +--echo #
> +SHOW VARIABLES like 'ft_max_word_len';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.ft_max_word_len;
> +SELECT @@global.ft_max_word_len;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.ft_max_word_len= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.ft_max_word_len= 7;
> +#
> +--echo #
> +SHOW VARIABLES like 'ft_min_word_len';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.ft_min_word_len;
> +SELECT @@global.ft_min_word_len;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.ft_min_word_len= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.ft_min_word_len= 7;
> +#
> +--echo #
> +SHOW VARIABLES like 'ft_query_expansion_limit';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.ft_query_expansion_limit;
> +SELECT @@global.ft_query_expansion_limit;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.ft_query_expansion_limit= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.ft_query_expansion_limit= 7;
> +#
> +--echo #
> +SHOW VARIABLES like 'ft_stopword_file';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.ft_stopword_file;
> +SELECT @@global.ft_stopword_file;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.ft_stopword_file= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.ft_stopword_file= 'x';
> +#
> +# Additional variables fixed.
> +#
> +--echo #
> +SHOW VARIABLES like 'back_log';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.back_log;
> +SELECT @@global.back_log;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.back_log= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.back_log= 7;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'large_files_support';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.large_files_support;
> +--replace_column 1 #
> +SELECT @@global.large_files_support;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.large_files_support= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.large_files_support= true;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'character_sets_dir';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.character_sets_dir;
> +--replace_column 1 #
> +SELECT @@global.character_sets_dir;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.character_sets_dir= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.character_sets_dir= 'x';
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'init_file';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.init_file;
> +--replace_column 1 #
> +SELECT @@global.init_file;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.init_file= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.init_file= 'x';
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'language';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.language;
> +--replace_column 1 #
> +SELECT @@global.language;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.language= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.language= 'x';
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'large_page_size';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.large_page_size;
> +--replace_column 1 #
> +SELECT @@global.large_page_size;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.large_page_size= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.large_page_size= 7;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'large_pages';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.large_pages;
> +--replace_column 1 #
> +SELECT @@global.large_pages;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.large_pages= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.large_pages= true;
> +#
> +# Only ifdef HAVE_MLOCKALL
> +#--echo #
> +#--replace_column 2 #
> +#SHOW VARIABLES like 'locked_in_memory';
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SELECT @@session.locked_in_memory;
> +#--replace_column 1 #
> +#SELECT @@global.locked_in_memory;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@session.locked_in_memory= true;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@global.locked_in_memory= true;
> +#


I can see why the test is commented, but I would not add commented test 
cases in the .test file at all, since this part is very likely to rot 
and be unmaintained.

My suggestion is to remove this (and related commented tests).
Up to you.


> +--echo #
> +SHOW VARIABLES like 'log_bin';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.log_bin;
> +SELECT @@global.log_bin;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.log_bin= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.log_bin= true;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'log_error';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.log_error;
> +--replace_column 1 #
> +SELECT @@global.log_error;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.log_error= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.log_error= 'x';
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'lower_case_file_system';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.lower_case_file_system;
> +--replace_column 1 #
> +SELECT @@global.lower_case_file_system;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.lower_case_file_system= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.lower_case_file_system= true;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'lower_case_table_names';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.lower_case_table_names;
> +--replace_column 1 #
> +SELECT @@global.lower_case_table_names;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.lower_case_table_names= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.lower_case_table_names= 7;
> +#
> +--echo #
> +SHOW VARIABLES like 'myisam_recover_options';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.myisam_recover_options;
> +SELECT @@global.myisam_recover_options;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.myisam_recover_options= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.myisam_recover_options= 'x';
> +#
> +# Only ifdef __NT__
> +#--echo #
> +#SHOW VARIABLES like 'named_pipe';
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SELECT @@session.named_pipe;
> +#SELECT @@global.named_pipe;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@session.named_pipe= true;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@global.named_pipe= true;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'open_files_limit';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.open_files_limit;
> +--replace_column 1 #
> +SELECT @@global.open_files_limit;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.open_files_limit= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.open_files_limit= 7;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'pid_file';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.pid_file;
> +--replace_column 1 #
> +SELECT @@global.pid_file;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.pid_file= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.pid_file= 'x';
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'plugin_dir';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.plugin_dir;
> +--replace_column 1 #
> +SELECT @@global.plugin_dir;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.plugin_dir= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.plugin_dir= 'x';
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'port';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.port;
> +--replace_column 1 #
> +SELECT @@global.port;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.port= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.port= 7;
> +#
> +--echo #
> +SHOW VARIABLES like 'protocol_version';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.protocol_version;
> +SELECT @@global.protocol_version;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.protocol_version= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.protocol_version= 7;
> +#
> +#Only ifdef HAVE_SMEM
> +#--echo #
> +#--replace_column 2 #
> +#SHOW VARIABLES like 'shared_memory';
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SELECT @@session.shared_memory;
> +#--replace_column 1 #
> +#SELECT @@global.shared_memory;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@session.shared_memory= true;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@global.shared_memory= true;
> +#
> +#Only ifdef HAVE_SMEM
> +#--echo #
> +#--replace_column 2 #
> +#SHOW VARIABLES like 'shared_memory_base_name';
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SELECT @@session.shared_memory_base_name;
> +#--replace_column 1 #
> +#SELECT @@global.shared_memory_base_name;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@session.shared_memory_base_name= 'x';
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@global.shared_memory_base_name= 'x';
> +#
> +--echo #
> +SHOW VARIABLES like 'skip_external_locking';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.skip_external_locking;
> +SELECT @@global.skip_external_locking;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.skip_external_locking= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.skip_external_locking= true;
> +#
> +--echo #
> +SHOW VARIABLES like 'skip_networking';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.skip_networking;
> +SELECT @@global.skip_networking;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.skip_networking= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.skip_networking= true;
> +#
> +--echo #
> +SHOW VARIABLES like 'skip_show_database';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.skip_show_database;
> +SELECT @@global.skip_show_database;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.skip_show_database= true;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.skip_show_database= true;
> +#
> +--echo #
> +--replace_column 2 #
> +SHOW VARIABLES like 'socket';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.socket;
> +--replace_column 1 #
> +SELECT @@global.socket;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.socket= 'x';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.socket= 'x';
> +#
> +# Only ifdef HAVE_THR_SETCONCURRENCY
> +#--echo #
> +#--replace_column 2 #
> +#SHOW VARIABLES like 'thread_concurrency';
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SELECT @@session.thread_concurrency;
> +#--replace_column 1 #
> +#SELECT @@global.thread_concurrency;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@session.thread_concurrency= 7;
> +#--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +#SET @@global.thread_concurrency= 7;
> +#
> +--echo #
> +#--replace_column 2 #
> +SHOW VARIABLES like 'thread_stack';
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SELECT @@session.thread_stack;
> +--replace_column 1 #
> +SELECT @@global.thread_stack;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@session.thread_stack= 7;
> +--error ER_INCORRECT_GLOBAL_LOCAL_VAR
> +SET @@global.thread_stack= 7;
> +#
> 
> === modified file 'sql/set_var.cc'
> --- a/sql/set_var.cc	2008-09-09 10:19:31 +0000
> +++ b/sql/set_var.cc	2008-10-04 19:21:39 +0000
> @@ -77,7 +77,6 @@ extern ulong ndb_report_thresh_binlog_me
>  extern CHARSET_INFO *character_set_filesystem;
>  
>  
> -static DYNAMIC_ARRAY fixed_show_vars;

Excellent.


>  static HASH system_variable_hash;
>  
>  const char *bool_type_names[]= { "OFF", "ON", NullS };
> @@ -174,6 +173,9 @@ sys_auto_increment_offset(&vars, "auto_i
>  static sys_var_bool_ptr	sys_automatic_sp_privileges(&vars,
> "automatic_sp_privileges",
>  					      &sp_automatic_privileges);
>  
> +static sys_var_const            sys_back_log(&vars, "back_log",
> +                                             OPT_GLOBAL, SHOW_LONG,
> +                                             (uchar*) &back_log);

Ok (and ok for all related sys_var_const).


>  static sys_var_const_str       sys_basedir(&vars, "basedir", mysql_home);
>  static sys_var_long_ptr	sys_binlog_cache_size(&vars, "binlog_cache_size",
>  					      &binlog_cache_size);
> @@ -181,6 +183,11 @@ static sys_var_thd_binlog_format sys_bin
>                                              &SV::binlog_format);
>  static sys_var_thd_ulong	sys_bulk_insert_buff_size(&vars,
> "bulk_insert_buffer_size",
>  						  &SV::bulk_insert_buff_size);
> +static sys_var_const            sys_character_sets_dir(&vars,
> +                                                       "character_sets_dir",
> +                                                       OPT_GLOBAL, SHOW_CHAR,
> +                                                       (uchar*)
> +                                                       mysql_charsets_dir);
>  static sys_var_character_set_sv
>  sys_character_set_server(&vars, "character_set_server",
>                           &SV::collation_server, &default_charset_info, 0,
> @@ -249,14 +256,31 @@ static sys_var_long_ptr	sys_expire_logs_
>  					     &expire_logs_days);
>  static sys_var_bool_ptr	sys_flush(&vars, "flush", &myisam_flush);
>  static sys_var_long_ptr	sys_flush_time(&vars, "flush_time", &flush_time);
> -static sys_var_str             sys_ft_boolean_syntax(&vars,
> "ft_boolean_syntax",
> -                                         sys_check_ftb_syntax,
> -                                         sys_update_ftb_syntax,
> -                                         sys_default_ftb_syntax,
> -                                         ft_boolean_syntax);
> +static sys_var_str      sys_ft_boolean_syntax(&vars, "ft_boolean_syntax",
> +                                              sys_check_ftb_syntax,
> +                                              sys_update_ftb_syntax,
> +                                              sys_default_ftb_syntax,
> +                                              ft_boolean_syntax);
> +static sys_var_const    sys_ft_max_word_len(&vars, "ft_max_word_len",
> +                                            OPT_GLOBAL, SHOW_LONG,
> +                                            (uchar*) &ft_max_word_len);
> +static sys_var_const    sys_ft_min_word_len(&vars, "ft_min_word_len",
> +                                            OPT_GLOBAL, SHOW_LONG,
> +                                            (uchar*) &ft_min_word_len);
> +static sys_var_const    sys_ft_query_expansion_limit(&vars,
> +                                                     "ft_query_expansion_limit",
> +                                                     OPT_GLOBAL, SHOW_LONG,
> +                                                     (uchar*)
> +                                                    
> &ft_query_expansion_limit);
> +static sys_var_const    sys_ft_stopword_file(&vars, "ft_stopword_file",
> +                                             OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                             (uchar*) &ft_stopword_file);
>  sys_var_str             sys_init_connect(&vars, "init_connect", 0,
>                                           sys_update_init_connect,
>                                           sys_default_init_connect,0);
> +static sys_var_const    sys_init_file(&vars, "init_file",
> +                                      OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                      (uchar*) &opt_init_file);
>  sys_var_str             sys_init_slave(&vars, "init_slave", 0,
>                                         sys_update_init_slave,
>                                         sys_default_init_slave,0);
> @@ -274,14 +298,37 @@ static sys_var_key_cache_long	sys_key_ca
>  static sys_var_key_cache_long  sys_key_cache_age_threshold(&vars,
> "key_cache_age_threshold",
>  						     offsetof(KEY_CACHE,
>  							      param_age_threshold));
> +static sys_var_const    sys_language(&vars, "language",
> +                                     OPT_GLOBAL, SHOW_CHAR,
> +                                     (uchar*) language);
> +static sys_var_const    sys_large_files_support(&vars, "large_files_support",
> +                                                OPT_GLOBAL, SHOW_BOOL,
> +                                                (uchar*) &opt_large_files);
> +static sys_var_const    sys_large_page_size(&vars, "large_page_size",
> +                                            OPT_GLOBAL, SHOW_INT,
> +                                            (uchar*) &opt_large_page_size);
> +static sys_var_const    sys_large_pages(&vars, "large_pages",
> +                                        OPT_GLOBAL, SHOW_MY_BOOL,
> +                                        (uchar*) &opt_large_pages);
>  static sys_var_bool_ptr	sys_local_infile(&vars, "local_infile",
>  					 &opt_local_infile);
> +#ifdef HAVE_MLOCKALL
> +static sys_var_const    sys_locked_in_memory(&vars, "locked_in_memory",
> +                                             OPT_GLOBAL, SHOW_MY_BOOL,
> +                                             (uchar*) &locked_in_memory);
> +#endif
> +static sys_var_const    sys_log_bin(&vars, "log_bin",
> +                                    OPT_GLOBAL, SHOW_BOOL,
> +                                    (uchar*) &opt_bin_log);
>  static sys_var_trust_routine_creators
>  sys_trust_routine_creators(&vars, "log_bin_trust_routine_creators",
>                             &trust_function_creators);
>  static sys_var_bool_ptr       
>  sys_trust_function_creators(&vars, "log_bin_trust_function_creators",
>                              &trust_function_creators);
> +static sys_var_const    sys_log_error(&vars, "log_error",
> +                                      OPT_GLOBAL, SHOW_CHAR,
> +                                      (uchar*) log_error_file);
>  static sys_var_bool_ptr
>    sys_log_queries_not_using_indexes(&vars, "log_queries_not_using_indexes",
>                                      &opt_log_queries_not_using_indexes);
> @@ -296,6 +343,16 @@ static sys_var_thd_bool	sys_sql_low_prio
>  						     &SV::low_priority_updates,
>  						     fix_low_priority_updates);
>  #endif
> +static sys_var_const    sys_lower_case_file_system(&vars,
> +                                                   "lower_case_file_system",
> +                                                   OPT_GLOBAL, SHOW_MY_BOOL,
> +                                                   (uchar*)
> +                                                   &lower_case_file_system);
> +static sys_var_const    sys_lower_case_table_names(&vars,
> +                                                   "lower_case_table_names",
> +                                                   OPT_GLOBAL, SHOW_INT,
> +                                                   (uchar*)
> +                                                   &lower_case_table_names);
>  static sys_var_thd_ulong	sys_max_allowed_packet(&vars, "max_allowed_packet",
>  					       &SV::max_allowed_packet);
>  static sys_var_long_ptr	sys_max_binlog_cache_size(&vars,
> "max_binlog_cache_size",
> @@ -359,6 +416,10 @@ static sys_var_thd_ulong       sys_multi
>  static sys_var_long_ptr	sys_myisam_data_pointer_size(&vars,
> "myisam_data_pointer_size",
>                                                      &myisam_data_pointer_size);
>  static sys_var_thd_ulonglong	sys_myisam_max_sort_file_size(&vars,
> "myisam_max_sort_file_size", &SV::myisam_max_sort_file_size,
> fix_myisam_max_sort_file_size, 1);
> +static sys_var_const sys_myisam_recover_options(&vars,
> "myisam_recover_options",
> +                                                OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                                (uchar*)
> +                                                &myisam_recover_options_str);
>  static sys_var_thd_ulong       sys_myisam_repair_threads(&vars,
> "myisam_repair_threads", &SV::myisam_repair_threads);
>  static sys_var_thd_ulong	sys_myisam_sort_buffer_size(&vars,
> "myisam_sort_buffer_size", &SV::myisam_sort_buff_size);
>  static sys_var_bool_ptr	sys_myisam_use_mmap(&vars, "myisam_use_mmap",
> @@ -369,6 +430,13 @@ static sys_var_thd_enum         sys_myis
>                                                  &myisam_stats_method_typelib,
>                                                  NULL);
>  
> +#ifdef __NT__
> +/* purecov: begin inspected */
> +static sys_var_const            sys_named_pipe(&vars, "named_pipe",
> +                                               OPT_GLOBAL, SHOW_MY_BOOL,
> +                                               (uchar*)
> &opt_enable_named_pipe);
> +/* purecov: end */
> +#endif
>  static sys_var_thd_ulong	sys_net_buffer_length(&vars, "net_buffer_length",
>  					      &SV::net_buffer_length);
>  static sys_var_thd_ulong	sys_net_read_timeout(&vars, "net_read_timeout",
> @@ -387,12 +455,29 @@ static sys_var_bool_ptr_readonly sys_old
>  sys_var_thd_bool                sys_old_alter_table(&vars, "old_alter_table",
>                                              &SV::old_alter_table);
>  sys_var_thd_bool                sys_old_passwords(&vars, "old_passwords",
> &SV::old_passwords);
> +static sys_var_const            sys_open_files_limit(&vars, "open_files_limit",
> +                                                     OPT_GLOBAL, SHOW_LONG,
> +                                                     (uchar*)
> +                                                     &open_files_limit);
>  static sys_var_thd_ulong        sys_optimizer_prune_level(&vars,
> "optimizer_prune_level",
>                                                    &SV::optimizer_prune_level);
>  static sys_var_thd_ulong        sys_optimizer_search_depth(&vars,
> "optimizer_search_depth",
>                                                    
> &SV::optimizer_search_depth);
> +static sys_var_const            sys_pid_file(&vars, "pid_file",
> +                                             OPT_GLOBAL, SHOW_CHAR,
> +                                             (uchar*) pidfile_name);
> +static sys_var_const            sys_plugin_dir(&vars, "plugin_dir",
> +                                               OPT_GLOBAL, SHOW_CHAR,
> +                                               (uchar*) opt_plugin_dir);
> +static sys_var_const            sys_port(&vars, "port",
> +                                         OPT_GLOBAL, SHOW_INT,
> +                                         (uchar*) &mysqld_port);
>  static sys_var_thd_ulong        sys_preload_buff_size(&vars,
> "preload_buffer_size",
>                                                &SV::preload_buff_size);
> +static sys_var_const            sys_protocol_version(&vars, "protocol_version",
> +                                                     OPT_GLOBAL, SHOW_INT,
> +                                                     (uchar*)
> +                                                     &protocol_version);
>  static sys_var_thd_ulong	sys_read_buff_size(&vars, "read_buffer_size",
>  					   &SV::read_buff_size);
>  static sys_var_opt_readonly	sys_readonly(&vars, "read_only",
> &opt_readonly);
> @@ -414,6 +499,45 @@ static sys_var_thd_ulong	sys_query_alloc
>  static sys_var_thd_ulong	sys_query_prealloc_size(&vars, "query_prealloc_size",
>  						&SV::query_prealloc_size,
>  						0, fix_thd_mem_root);
> +#ifdef HAVE_SMEM
> +/* purecov: begin tested */
> +static sys_var_const    sys_shared_memory(&vars, "shared_memory",
> +                                          OPT_GLOBAL, SHOW_MY_BOOL,
> +                                          (uchar*)
> +                                          &opt_enable_shared_memory);
> +static sys_var_const    sys_shared_memory_base_name(&vars,
> +                                                    "shared_memory_base_name",
> +                                                    OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                                    (uchar*)
> +                                                    &shared_memory_base_name);
> +/* purecov: end */
> +#endif
> +static sys_var_const    sys_skip_external_locking(&vars,
> +                                                  "skip_external_locking",
> +                                                  OPT_GLOBAL, SHOW_MY_BOOL,
> +                                                  (uchar*)
> +                                                  &my_disable_locking);
> +static sys_var_const    sys_skip_networking(&vars, "skip_networking",
> +                                            OPT_GLOBAL, SHOW_BOOL,
> +                                            (uchar*) &opt_disable_networking);
> +static sys_var_const    sys_skip_show_database(&vars, "skip_show_database",
> +                                            OPT_GLOBAL, SHOW_BOOL,
> +                                            (uchar*) &opt_skip_show_db);
> +#ifdef HAVE_SYS_UN_H
> +static sys_var_const    sys_socket(&vars, "socket",
> +                                   OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                   (uchar*) &mysqld_unix_port);
> +#endif
> +#ifdef HAVE_THR_SETCONCURRENCY
> +/* purecov: begin tested */
> +static sys_var_const    sys_thread_concurrency(&vars, "thread_concurrency",
> +                                               OPT_GLOBAL, SHOW_LONG,
> +                                               (uchar*) &concurrency);
> +/* purecov: end */
> +#endif
> +static sys_var_const    sys_thread_stack(&vars, "thread_stack",
> +                                         OPT_GLOBAL, SHOW_LONG,
> +                                         (uchar*) &my_thread_stack_size);
>  static sys_var_readonly        sys_tmpdir(&vars, "tmpdir", OPT_GLOBAL,
> SHOW_CHAR, get_tmpdir);
>  static sys_var_thd_ulong	sys_trans_alloc_block_size(&vars,
> "transaction_alloc_block_size",
>  						   &SV::trans_alloc_block_size,
> @@ -764,59 +888,6 @@ static sys_var_log_output sys_var_log_ou
>  					    &log_output_typelib, 0);
>  
>  
> -/*
> -  Additional variables (not derived from sys_var class, not accessible as
> -  @@varname in SELECT or SET). Sorted in alphabetical order to facilitate
> -  maintenance - SHOW VARIABLES will sort its output.
> -  TODO: remove this list completely
> -*/
> -
> -#define FIXED_VARS_SIZE (sizeof(fixed_vars) / sizeof(SHOW_VAR))
> -static SHOW_VAR fixed_vars[]= {
> -  {"back_log",                (char*) &back_log,                    SHOW_LONG},
> -  {"character_sets_dir",      mysql_charsets_dir,                   SHOW_CHAR},
> -  {"ft_max_word_len",         (char*) &ft_max_word_len,             SHOW_LONG},
> -  {"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},
> -  {"init_file",               (char*) &opt_init_file,              
> SHOW_CHAR_PTR},
> -  {"language",                language,                             SHOW_CHAR},
> -  {"large_files_support",     (char*) &opt_large_files,             SHOW_BOOL},
> -  {"large_page_size",         (char*) &opt_large_page_size,         SHOW_INT},
> -  {"large_pages",             (char*) &opt_large_pages,            
> SHOW_MY_BOOL},
> -#ifdef HAVE_MLOCKALL
> -  {"locked_in_memory",	      (char*) &locked_in_memory,	    SHOW_MY_BOOL},
> -#endif
> -  {"log_bin",                 (char*) &opt_bin_log,                 SHOW_BOOL},
> -  {"log_error",               (char*) log_error_file,               SHOW_CHAR},
> -  {"lower_case_file_system",  (char*) &lower_case_file_system,     
> SHOW_MY_BOOL},
> -  {"lower_case_table_names",  (char*) &lower_case_table_names,      SHOW_INT},
> -  {"myisam_recover_options",  (char*) &myisam_recover_options_str, 
> SHOW_CHAR_PTR},
> -#ifdef __NT__
> -  {"named_pipe",	      (char*) &opt_enable_named_pipe,       SHOW_MY_BOOL},
> -#endif
> -  {"open_files_limit",	      (char*) &open_files_limit,	    SHOW_LONG},
> -  {"pid_file",                (char*) pidfile_name,                 SHOW_CHAR},
> -  {"plugin_dir",              (char*) opt_plugin_dir,               SHOW_CHAR},
> -  {"port",                    (char*) &mysqld_port,                 SHOW_INT},
> -  {"protocol_version",        (char*) &protocol_version,            SHOW_INT},
> -#ifdef HAVE_SMEM
> -  {"shared_memory",           (char*) &opt_enable_shared_memory,   
> SHOW_MY_BOOL},
> -  {"shared_memory_base_name", (char*) &shared_memory_base_name,    
> SHOW_CHAR_PTR},
> -#endif
> -  {"skip_external_locking",   (char*) &my_disable_locking,         
> SHOW_MY_BOOL},
> -  {"skip_networking",         (char*) &opt_disable_networking,      SHOW_BOOL},
> -  {"skip_show_database",      (char*) &opt_skip_show_db,            SHOW_BOOL},
> -#ifdef HAVE_SYS_UN_H
> -  {"socket",                  (char*) &mysqld_unix_port,           
> SHOW_CHAR_PTR},
> -#endif
> -#ifdef HAVE_THR_SETCONCURRENCY
> -  {"thread_concurrency",      (char*) &concurrency,                 SHOW_LONG},
> -#endif
> -  {"thread_stack",            (char*) &my_thread_stack_size,        SHOW_LONG},
> -};
> -
> -

Removing fixed_var: totally agree.


>  bool sys_var::check(THD *thd, set_var *var)
>  {
>    var->save_result.ulonglong_value= var->value->val_int();
> @@ -1744,17 +1815,19 @@ err:
>  
>  Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base)
>  {
> +  DBUG_ENTER("sys_var::item");

Ok

>    if (check_type(var_type))
>    {
>      if (var_type != OPT_DEFAULT)
>      {
>        my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0),
>                 name, var_type == OPT_GLOBAL ? "SESSION" : "GLOBAL");
> -      return 0;
> +      DBUG_RETURN(0);

Ok

>      }
>      /* As there was no local variable, return the global value */
>      var_type= OPT_GLOBAL;
>    }
> +  DBUG_PRINT("sysvar", ("var name: '%s'  show_type: %d", name, show_type()));

Great.

>    switch (show_type()) {
>    case SHOW_INT:
>    {
> @@ -1762,7 +1835,7 @@ Item *sys_var::item(THD *thd, enum_var_t
>      pthread_mutex_lock(&LOCK_global_system_variables);
>      value= *(uint*) value_ptr(thd, var_type, base);
>      pthread_mutex_unlock(&LOCK_global_system_variables);
> -    return new Item_uint((ulonglong) value);
> +    DBUG_RETURN(new Item_uint((ulonglong) value));

Thanks for adding DBUG code here, but please don't do that.

Instead:
   result= new Item_uint((ulonglong) value)
   DBUG_RETURN(result)

It makes debugging step by step much easier, for the same binary anyway.

The same applies below.

>    }
>    case SHOW_LONG:
>    {
> @@ -1770,7 +1843,7 @@ Item *sys_var::item(THD *thd, enum_var_t
>      pthread_mutex_lock(&LOCK_global_system_variables);
>      value= *(ulong*) value_ptr(thd, var_type, base);
>      pthread_mutex_unlock(&LOCK_global_system_variables);
> -    return new Item_uint((ulonglong) value);
> +    DBUG_RETURN(new Item_uint((ulonglong) value));
>    }
>    case SHOW_LONGLONG:
>    {
> @@ -1778,7 +1851,7 @@ Item *sys_var::item(THD *thd, enum_var_t
>      pthread_mutex_lock(&LOCK_global_system_variables);
>      value= *(longlong*) value_ptr(thd, var_type, base);
>      pthread_mutex_unlock(&LOCK_global_system_variables);
> -    return new Item_int(value);
> +    DBUG_RETURN(new Item_int(value));
>    }
>    case SHOW_DOUBLE:
>    {
> @@ -1787,7 +1860,7 @@ Item *sys_var::item(THD *thd, enum_var_t
>      value= *(double*) value_ptr(thd, var_type, base);
>      pthread_mutex_unlock(&LOCK_global_system_variables);
>      /* 6, as this is for now only used with microseconds */
> -    return new Item_float(value, 6);
> +    DBUG_RETURN(new Item_float(value, 6));
>    }
>    case SHOW_HA_ROWS:
>    {
> @@ -1795,7 +1868,15 @@ Item *sys_var::item(THD *thd, enum_var_t
>      pthread_mutex_lock(&LOCK_global_system_variables);
>      value= *(ha_rows*) value_ptr(thd, var_type, base);
>      pthread_mutex_unlock(&LOCK_global_system_variables);
> -    return new Item_int((ulonglong) value);
> +    DBUG_RETURN(new Item_int((ulonglong) value));
> +  }
> +  case SHOW_BOOL:
> +  {
> +    int32 value;
> +    pthread_mutex_lock(&LOCK_global_system_variables);
> +    value= *(bool*) value_ptr(thd, var_type, base);
> +    pthread_mutex_unlock(&LOCK_global_system_variables);

Adding SHOW_BOOL: ok.

> +    DBUG_RETURN(new Item_int(value,1));
>    }
>    case SHOW_MY_BOOL:
>    {
> @@ -1803,7 +1884,7 @@ Item *sys_var::item(THD *thd, enum_var_t
>      pthread_mutex_lock(&LOCK_global_system_variables);
>      value= *(my_bool*) value_ptr(thd, var_type, base);
>      pthread_mutex_unlock(&LOCK_global_system_variables);
> -    return new Item_int(value,1);
> +    DBUG_RETURN(new Item_int(value,1));
>    }
>    case SHOW_CHAR_PTR:
>    {
> @@ -1822,7 +1903,7 @@ Item *sys_var::item(THD *thd, enum_var_t
>        tmp->collation.set(system_charset_info, DERIVATION_SYSCONST);
>      }
>      pthread_mutex_unlock(&LOCK_global_system_variables);
> -    return tmp;
> +    DBUG_RETURN(tmp);
>    }
>    case SHOW_CHAR:
>    {
> @@ -1838,12 +1919,39 @@ Item *sys_var::item(THD *thd, enum_var_t
>        tmp->collation.set(system_charset_info, DERIVATION_SYSCONST);
>      }
>      pthread_mutex_unlock(&LOCK_global_system_variables);
> -    return tmp;
> +    DBUG_RETURN(tmp);
> +  }
> +  case SHOW_FUNC:
> +  {
> +    /*
> +      This has been added when moving fixed_vars[] into the system
> +      variable chain (Bug#28234 - global/session scope - documentation
> +      vs implementation). At this time only one SHOW_FUNC variable
> +      existed (slave_skip_errors) and it delivered a character string.
> +      If/when new SHOW_FUNC variables are introduced with different
> +      return types, the function evaluation should be moved to the top
> +      of the function, and all cases rewritten to use the resulting
> +      value.
> +    */


I have a different take on this, see some global comments at the end.


> +    MY_ALIGNED_BYTE_ARRAY(buff_data, SHOW_VAR_FUNC_BUFF_SIZE, long);
> +    SHOW_VAR svar;
> +    uint length;
> +    char * const buff= (char *) &buff_data;
> +    Item *tmp;
> +    pthread_mutex_lock(&LOCK_global_system_variables);
> +    ((mysql_show_var_func)value_ptr(thd, var_type, base))(thd, &svar, buff);
> +    pthread_mutex_unlock(&LOCK_global_system_variables);
> +    /* Assuming a string. See comment above. */
> +    DBUG_ASSERT(svar.type == SHOW_CHAR);
> +    length= strlen(svar.value);
> +    tmp= new Item_string(thd->strmake(svar.value, length), length,
> +                         system_charset_info, DERIVATION_SYSCONST);
> +    DBUG_RETURN(tmp);
>    }
>    default:
>      my_error(ER_VAR_CANT_BE_READ, MYF(0), name);
>    }
> -  return 0;
> +  DBUG_RETURN(0);
>  }
>  
>  
> @@ -3225,14 +3333,12 @@ static int show_cmp(SHOW_VAR *a, SHOW_VA
>  SHOW_VAR* enumerate_sys_vars(THD *thd, bool sorted)
>  {
>    int count= system_variable_hash.records, i;
> -  int fixed_count= fixed_show_vars.elements;
> -  int size= sizeof(SHOW_VAR) * (count + fixed_count + 1);
> +  int size= sizeof(SHOW_VAR) * (count + 1);

Ok

>    SHOW_VAR *result= (SHOW_VAR*) thd->alloc(size);
>  
>    if (result)
>    {
> -    SHOW_VAR *show= result + fixed_count;
> -    memcpy(result, fixed_show_vars.buffer, fixed_count * sizeof(SHOW_VAR));
> +    SHOW_VAR *show= result;

Ok

>  
>      for (i= 0; i < count; i++)
>      {
> @@ -3245,7 +3351,7 @@ SHOW_VAR* enumerate_sys_vars(THD *thd, b
>  
>      /* sort into order */
>      if (sorted)
> -      my_qsort(result, count + fixed_count, sizeof(SHOW_VAR),
> +      my_qsort(result, count, sizeof(SHOW_VAR),
>                 (qsort_cmp) show_cmp);

Ok

>      
>      /* make last element empty */
> @@ -3273,13 +3379,6 @@ int set_var_init()
>    
>    for (sys_var *var=vars.first; var; var= var->next, count++);
>  
> -  if (my_init_dynamic_array(&fixed_show_vars, sizeof(SHOW_VAR),
> -                            FIXED_VARS_SIZE + 64, 64))
> -    goto error;
> -
> -  fixed_show_vars.elements= FIXED_VARS_SIZE;
> -  memcpy(fixed_show_vars.buffer, fixed_vars, sizeof(fixed_vars));
> -

Ok

>    if (hash_init(&system_variable_hash, system_charset_info, count, 0,
>                  0, (hash_get_key) get_sys_var_length, 0, HASH_UNIQUE))
>      goto error;
> @@ -3307,28 +3406,6 @@ error:
>  void set_var_free()
>  {
>    hash_free(&system_variable_hash);
> -  delete_dynamic(&fixed_show_vars);
> -}
> -
> -
> -/*
> -  Add elements to the dynamic list of read-only system variables.
> -  
> -  SYNOPSIS
> -    mysql_append_static_vars()
> -    show_vars	Pointer to start of array
> -    count       Number of elements
> -  
> -  RETURN VALUES
> -    0           SUCCESS
> -    otherwise   FAILURE
> -*/
> -int mysql_append_static_vars(const SHOW_VAR *show_vars, uint count)
> -{
> -  for (; count > 0; count--, show_vars++)
> -    if (insert_dynamic(&fixed_show_vars, (uchar*) show_vars))
> -      return 1;
> -  return 0;
>  }

Ok, all that just result from removing the "fixed" system variables.

>  
>  
> 
> === modified file 'sql/set_var.h'
> --- a/sql/set_var.h	2008-09-09 10:19:31 +0000
> +++ b/sql/set_var.h	2008-10-04 19:21:39 +0000
> @@ -930,6 +930,32 @@ public:
>  };
>  
>  
> +/* Global-only, read-only variable. E.g. command line option. */

Please use doxygen comments here.

> +
> +class sys_var_const: public sys_var
> +{
> +public:
> +  enum_var_type var_type;
> +  SHOW_TYPE show_type_value;
> +  uchar *ptr;
> +  sys_var_const(sys_var_chain *chain, const char *name_arg, enum_var_type type,
> +                SHOW_TYPE show_type_arg, uchar *ptr_arg)
> +    :sys_var(name_arg), var_type(type),
> +    show_type_value(show_type_arg), ptr(ptr_arg)
> +  { chain_sys_var(chain); }
> +  bool update(THD *thd, set_var *var) { return 1; }
> +  bool check_default(enum_var_type type) { return 1; }
> +  bool check_type(enum_var_type type) { return type != var_type; }
> +  bool check_update_type(Item_result type) { return 1; }
> +  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
> +  {
> +    return ptr;
> +  }
> +  SHOW_TYPE show_type() { return show_type_value; }
> +  bool is_readonly() const { return 1; }
> +};
> +
> +

New sys_var_const class: good.


>  class sys_var_have_option: public sys_var
>  {
>  protected:
> @@ -1295,7 +1321,6 @@ struct sys_var_with_base
>  
>  int set_var_init();
>  void set_var_free();
> -int mysql_append_static_vars(const SHOW_VAR *show_vars, uint count);
>  SHOW_VAR* enumerate_sys_vars(THD *thd, bool sorted);
>  int mysql_add_sys_var_chain(sys_var *chain, struct my_option *long_options);
>  int mysql_del_sys_var_chain(sys_var *chain);
> 
> === modified file 'sql/sql_repl.cc'
> --- a/sql/sql_repl.cc	2008-08-21 11:47:23 +0000
> +++ b/sql/sql_repl.cc	2008-10-04 19:21:39 +0000
> @@ -1658,32 +1658,46 @@ public:
>    bool update(THD *thd, set_var *var);
>  };
>  
> +static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff);
> +

See comments at the end.


>  static sys_var_chain vars = { NULL, NULL };
>  
> +static sys_var_const    sys_log_slave_updates(&vars, "log_slave_updates",
> +                                              OPT_GLOBAL, SHOW_MY_BOOL,
> +                                              (uchar*) &opt_log_slave_updates);
> +static sys_var_const    sys_relay_log(&vars, "relay_log",
> +                                      OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                      (uchar*) &opt_relay_logname);
> +static sys_var_const    sys_relay_log_index(&vars, "relay_log_index",
> +                                      OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                      (uchar*) &opt_relaylog_index_name);
> +static sys_var_const    sys_relay_log_info_file(&vars, "relay_log_info_file",
> +                                      OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                      (uchar*) &relay_log_info_file);
>  static sys_var_bool_ptr	sys_relay_log_purge(&vars, "relay_log_purge",
>  					    &relay_log_purge);
> +static sys_var_const    sys_relay_log_space_limit(&vars,
> +                                                  "relay_log_space_limit",
> +                                                  OPT_GLOBAL, SHOW_LONGLONG,
> +                                                  (uchar*)
> +                                                  &relay_log_space_limit);
> +static sys_var_const    sys_slave_load_tmpdir(&vars, "slave_load_tmpdir",
> +                                              OPT_GLOBAL, SHOW_CHAR_PTR,
> +                                              (uchar*) &slave_load_tmpdir);
>  static sys_var_long_ptr	sys_slave_net_timeout(&vars, "slave_net_timeout",
>  					      &slave_net_timeout);
> +static sys_var_const    sys_slave_skip_errors(&vars, "slave_skip_errors",
> +                                              OPT_GLOBAL, SHOW_FUNC,
> +                                              (uchar*) show_slave_skip_errors);
>  static sys_var_long_ptr	sys_slave_trans_retries(&vars,
> "slave_transaction_retries",
>  						&slave_trans_retries);
>  static sys_var_sync_binlog_period sys_sync_binlog_period(&vars, "sync_binlog",
> &sync_binlog_period);
>  static sys_var_slave_skip_counter sys_slave_skip_counter(&vars,
> "sql_slave_skip_counter");
>  
> -static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff);
> -
> -
> -static SHOW_VAR fixed_vars[]= {
> -  {"log_slave_updates",       (char*) &opt_log_slave_updates,      
> SHOW_MY_BOOL},
> -  {"relay_log" , (char*) &opt_relay_logname, SHOW_CHAR_PTR},
> -  {"relay_log_index", (char*) &opt_relaylog_index_name, SHOW_CHAR_PTR},
> -  {"relay_log_info_file", (char*) &relay_log_info_file, SHOW_CHAR_PTR},
> -  {"relay_log_space_limit",   (char*) &relay_log_space_limit,      
> SHOW_LONGLONG},
> -  {"slave_load_tmpdir",       (char*) &slave_load_tmpdir,          
> SHOW_CHAR_PTR},
> -  {"slave_skip_errors",       (char*) &show_slave_skip_errors,      SHOW_FUNC},
> -};
>  
>  static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff)
>  {
> +  DBUG_ENTER("show_slave_skip_errors");
>    var->type=SHOW_CHAR;
>    var->value= buff;
>    if (!use_slave_mask || bitmap_is_clear_all(&slave_error_mask))
> @@ -1716,7 +1730,8 @@ static int show_slave_skip_errors(THD *t
>        buff= strmov(buff, "...");  // Couldn't show all errors
>      *buff=0;
>    }
> -  return 0;
> +  DBUG_PRINT("show", ("var value: '%s'  type: %d", var->value, var->type));
> +  DBUG_RETURN(0);
>  }

See comments at the end.

>  
>  bool sys_var_slave_skip_counter::check(THD *thd, set_var *var)
> @@ -1765,8 +1780,6 @@ bool sys_var_sync_binlog_period::update(
>  
>  int init_replication_sys_vars()
>  {
> -  mysql_append_static_vars(fixed_vars, sizeof(fixed_vars) / sizeof(SHOW_VAR));
> -
>    if (mysql_add_sys_var_chain(vars.first, my_long_options))
>    {
>      /* should not happen */
> 
> === modified file 'sql/sql_show.cc'
> --- a/sql/sql_show.cc	2008-08-20 22:18:33 +0000
> +++ b/sql/sql_show.cc	2008-10-04 19:21:39 +0000
> @@ -2062,6 +2062,8 @@ static bool show_status_array(THD *thd, 
>    LEX_STRING null_lex_str;
>    SHOW_VAR tmp, *var;
>    DBUG_ENTER("show_status_array");
> +  DBUG_PRINT("show", ("wild: '%s'  prefix: '%s'  value_type: %d",
> +                      wild, prefix, value_type));
>  
>    null_lex_str.str= 0;				// For sys_var->value_ptr()
>    null_lex_str.length= 0;
> @@ -2073,6 +2075,8 @@ static bool show_status_array(THD *thd, 
>  
>    for (; variables->name; variables++)
>    {
> +    DBUG_PRINT("show", ("variable: '%s'  type: %d",
> +                        variables->name, variables->type));
>      strnmov(prefix_end, variables->name, len);
>      name_buffer[sizeof(name_buffer)-1]=0;       /* Safety */
>      if (ucase_names)
> @@ -2086,6 +2090,7 @@ static bool show_status_array(THD *thd, 
>        ((mysql_show_var_func)(var->value))(thd, &tmp, buff);
>  
>      SHOW_TYPE show_type=var->type;
> +    DBUG_PRINT("show", ("show_type: %d", show_type));
>      if (show_type == SHOW_ARRAY)
>      {
>        show_status_array(thd, wild, (SHOW_VAR *) var->value, value_type,
> @@ -2106,6 +2111,34 @@ static bool show_status_array(THD *thd, 
>            show_type= ((sys_var*) value)->show_type();
>            value=     (char*) ((sys_var*) value)->value_ptr(thd, value_type,
>                                                             &null_lex_str);
> +          /*
> +            This has been added when moving fixed_vars[] into the system
> +            variable chain (Bug#28234 - global/session scope -
> +            documentation vs implementation). The above SHOW_FUNC loop
> +            was not used, as the variable slave_skip_errors came here as
> +            SHOW_SYS type. The SHOW_FUNC type popped up after evaluating
> +            show_type().
> +
> +            I am however unsure at this time, if the below loop is
> +            required, or if a single go would do. Also I don't know if
> +            value_ptr() needs to be evaluated again to get at the
> +            function address. So for now I assert that we do not have a
> +            nested SHOW_FUNC.
> +          */

See comments at the end.


> +          for (; show_type == SHOW_FUNC;)
> +          {
> +            ((mysql_show_var_func)(value))(thd, &tmp, buff);
> +            var= &tmp;
> +            show_type= var->type;
> +            value= var->value;
> +#ifdef NOT_YET
> +            if (show_type == SHOW_FUNC)
> +              value= (char*) ((sys_var*) value)->value_ptr(thd, value_type,
> +                                                           &null_lex_str);
> +#else
> +            DBUG_ASSERT(show_type != SHOW_FUNC);
> +#endif
> +          }
>          }
>  
>          pos= end= buff;
> 
> 

Overall comments:

1) Removing the fixed_var array : excellent

2) Adding a sys_var_const class : excellent.

There is some debate in the review thread about how to design this class 
in details, and about usage of C++ inheritance to save 1 line of code.

My take on this is:
this debate makes the assumption that the overall design of mysql system 
variables is already perfect, and discusses how the general C++ class 
hierarchy can be modeled.

My personal opinion is that some major refactoring of the server system 
variables is needed anyway, for other reasons, because there are still 
many design flaws there.
For example, see Bug#27508.

This fix already does some major cleanup by removing the fixed_var array 
and integrating "fixed system variables", and is good enought for the 
problem reported.

I am not saying whether sys_var_read_only is a good or bad idea, it may 
very well appear later, but I think it's premature to discuss it, and 
it's not needed for this bug.

3) About the "slave_skip_errors" system variable.

If I understand correctly, "slave_skip_errors" is set once for all when 
the server starts, so it really is a "constant", not a "read-only" variable.

As a result, "slave_skip_errors" is implemented with sys_var_const, 
that's correct.

Now, for a constant system variable, which is by definition frozen for 
the entire server life time, I think using SHOW_FUNC is a bad idea.
If it's that constant, the value should be computed once, and stored in 
a global variable, instead of being recalculated at every request.

Requested changes:

a) remove the function show_slave_skip_errors() entirely.
b) implement a global variable to hold the content of the 
"slave_skip_errors" system variable
c) move the logic of show_slave_skip_errors() in 
init_slave_skip_errors(), to initialize this global variable once.

With that, support for SHOW_FUNC for sys_var_const is not needed 
anymore, and support for SHOW_FUNC should in fact never be needed, 
otherwise the system variable won't really be a "constant" one.

This should simplify greatly the implementation of:
- sys_var::check
- show_status_array
so that the special code added for SHOW_FUNC only for 
"slave_skip_errors" can be removed.


Thanks for investigating this, in hope it helps ;)


Thread
bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Ingo Struewing4 Oct
  • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Andrei Elkin13 Nov
    • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Ingo Strüwing13 Nov
      • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Andrei Elkin14 Nov
        • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Ingo Strüwing14 Nov
          • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Andrei Elkin17 Nov
          • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Andrei Elkin17 Nov
          • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Andrei Elkin18 Nov
  • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Marc Alff17 Nov
    • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Ingo Strüwing18 Nov
      • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Andrei Elkin18 Nov
    • Re: bzr commit into mysql-5.1 branch (ingo.struewing:2751) Bug#28234Ingo Strüwing20 Nov