Description:
Several of the system variables that are displayed by SHOW VARIABLES cannot be selected with SELECT @@{GLOBAL,SESSION}.var_name. Example:
mysql> SHOW GLOBAL VARIABLES LIKE 'back\_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log | 50 |
+---------------+-------+
1 row in set (0.01 sec)
mysql> SELECT @@GLOBAL.back_log;
ERROR 1193 (HY000): Unknown system variable 'back_log'
It's inconsistent for some system variables to be SELECT-able and not others.
It shouldn't be necessary to have to test whether a system variable can be used in this way, it should work for all of them.
How to repeat:
For 5.0.56, here is a partial listing of the variables not SELECT-able (along with the SHOW VARIABLES statements that display the values). Following the list is the Ruby program I used to generate the list. I will attach the full list to the report after submitting it.
SHOW GLOBAL VARIABLES LIKE 'back\_log';
SELECT @@GLOBAL.back_log;
SHOW GLOBAL VARIABLES LIKE 'character\_sets\_dir';
SELECT @@GLOBAL.character_sets_dir;
SHOW GLOBAL VARIABLES LIKE 'ft\_max\_word\_len';
SELECT @@GLOBAL.ft_max_word_len;
SHOW GLOBAL VARIABLES LIKE 'ft\_min\_word\_len';
SELECT @@GLOBAL.ft_min_word_len;
SHOW GLOBAL VARIABLES LIKE 'ft\_query\_expansion\_limit';
SELECT @@GLOBAL.ft_query_expansion_limit;
SHOW GLOBAL VARIABLES LIKE 'ft\_stopword\_file';
SELECT @@GLOBAL.ft_stopword_file;
SHOW GLOBAL VARIABLES LIKE 'have\_archive';
SELECT @@GLOBAL.have_archive;
SHOW GLOBAL VARIABLES LIKE 'have\_bdb';
SELECT @@GLOBAL.have_bdb;
SHOW GLOBAL VARIABLES LIKE 'have\_blackhole\_engine';
SELECT @@GLOBAL.have_blackhole_engine;
SHOW GLOBAL VARIABLES LIKE 'have\_compress';
SELECT @@GLOBAL.have_compress;
SHOW GLOBAL VARIABLES LIKE 'have\_crypt';
SELECT @@GLOBAL.have_crypt;
SHOW GLOBAL VARIABLES LIKE 'have\_csv';
SELECT @@GLOBAL.have_csv;
SHOW GLOBAL VARIABLES LIKE 'have\_dynamic\_loading';
SELECT @@GLOBAL.have_dynamic_loading;
SHOW GLOBAL VARIABLES LIKE 'have\_example\_engine';
SELECT @@GLOBAL.have_example_engine;
SHOW GLOBAL VARIABLES LIKE 'have\_federated\_engine';
SELECT @@GLOBAL.have_federated_engine;
SHOW GLOBAL VARIABLES LIKE 'have\_geometry';
SELECT @@GLOBAL.have_geometry;
SHOW GLOBAL VARIABLES LIKE 'have\_isam';
SELECT @@GLOBAL.have_isam;
SHOW GLOBAL VARIABLES LIKE 'have\_merge\_engine';
SELECT @@GLOBAL.have_merge_engine;
SHOW GLOBAL VARIABLES LIKE 'have\_ndbcluster';
SELECT @@GLOBAL.have_ndbcluster;
SHOW GLOBAL VARIABLES LIKE 'have\_openssl';
SELECT @@GLOBAL.have_openssl;
SHOW GLOBAL VARIABLES LIKE 'have\_ssl';
SELECT @@GLOBAL.have_ssl;
SHOW GLOBAL VARIABLES LIKE 'have\_query\_cache';
SELECT @@GLOBAL.have_query_cache;
SHOW GLOBAL VARIABLES LIKE 'have\_raid';
SELECT @@GLOBAL.have_raid;
SHOW GLOBAL VARIABLES LIKE 'have\_rtree\_keys';
SELECT @@GLOBAL.have_rtree_keys;
SHOW GLOBAL VARIABLES LIKE 'have\_symlink';
SELECT @@GLOBAL.have_symlink;
SHOW GLOBAL VARIABLES LIKE 'init\_file';
SELECT @@GLOBAL.init_file;
SHOW GLOBAL VARIABLES LIKE 'innodb\_additional\_mem\_pool\_size';
SELECT @@GLOBAL.innodb_additional_mem_pool_size;
Ruby program to generate list:
#!/usr/bin/ruby -w
# sysvar2.rb - Discover global system variables that are shown by SHOW
# variables but cannot be selected via SELECT @@GLOBAL.var_name.
require "optparse"
require "dbi"
# variable-scope constants
GLOBAL = 1
SESSION = 2
def test_sysvar(dbh, var_name, scope)
scope_name = (scope == GLOBAL ? "GLOBAL" : "SESSION")
begin
row = dbh.select_one("SELECT @@#{scope_name}.#{var_name}")
rescue DBI::DatabaseError => e
# print statements that will show the variable is displayed by SHOW
# variables but cannot be selected with SELECT.
esc_var_name = var_name.gsub(/_/, "\\_")
puts "SHOW #{scope_name} VARIABLES LIKE '#{esc_var_name}';"
puts "SELECT @@#{scope_name}.#{var_name};"
end
end
# ----------------------------------------------------------------------
# main program
# ----------------------------------------------------------------------
host_name = "127.0.0.1"
port_num = 3306
opts = OptionParser.new do |opts|
opts.summary_indent = ""
opts.summary_width -= 3
opts.banner = "Usage: #{$0} [options] command"
opts.on("-?", "--help",
"Display this message and exit") do
puts opts
exit 0
end
opts.on("-h", "--host=host_name", String,
"Host to connect to") do |str|
host_name = str
end
opts.on("-P", "--port=port_num", Integer,
"TCP/IP port number") do |val|
port_num = val
end
end
opts.parse!(ARGV)
# Expect no more arguments
unless ARGV.empty?
puts opts
exit 1
end
dsn = "dbi:Mysql:host=#{host_name};port=#{port_num}" +
";mysql_read_default_group=client"
dbh = DBI.connect(dsn,nil,nil)
dbh.select_all("SHOW GLOBAL VARIABLES").each do |row|
test_sysvar(dbh, row[0], GLOBAL)
end
dbh.select_all("SHOW SESSION VARIABLES").each do |row|
test_sysvar(dbh, row[0], SESSION)
end
dbh.disconnect if dbh
Description: Several of the system variables that are displayed by SHOW VARIABLES cannot be selected with SELECT @@{GLOBAL,SESSION}.var_name. Example: mysql> SHOW GLOBAL VARIABLES LIKE 'back\_log'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | back_log | 50 | +---------------+-------+ 1 row in set (0.01 sec) mysql> SELECT @@GLOBAL.back_log; ERROR 1193 (HY000): Unknown system variable 'back_log' It's inconsistent for some system variables to be SELECT-able and not others. It shouldn't be necessary to have to test whether a system variable can be used in this way, it should work for all of them. How to repeat: For 5.0.56, here is a partial listing of the variables not SELECT-able (along with the SHOW VARIABLES statements that display the values). Following the list is the Ruby program I used to generate the list. I will attach the full list to the report after submitting it. SHOW GLOBAL VARIABLES LIKE 'back\_log'; SELECT @@GLOBAL.back_log; SHOW GLOBAL VARIABLES LIKE 'character\_sets\_dir'; SELECT @@GLOBAL.character_sets_dir; SHOW GLOBAL VARIABLES LIKE 'ft\_max\_word\_len'; SELECT @@GLOBAL.ft_max_word_len; SHOW GLOBAL VARIABLES LIKE 'ft\_min\_word\_len'; SELECT @@GLOBAL.ft_min_word_len; SHOW GLOBAL VARIABLES LIKE 'ft\_query\_expansion\_limit'; SELECT @@GLOBAL.ft_query_expansion_limit; SHOW GLOBAL VARIABLES LIKE 'ft\_stopword\_file'; SELECT @@GLOBAL.ft_stopword_file; SHOW GLOBAL VARIABLES LIKE 'have\_archive'; SELECT @@GLOBAL.have_archive; SHOW GLOBAL VARIABLES LIKE 'have\_bdb'; SELECT @@GLOBAL.have_bdb; SHOW GLOBAL VARIABLES LIKE 'have\_blackhole\_engine'; SELECT @@GLOBAL.have_blackhole_engine; SHOW GLOBAL VARIABLES LIKE 'have\_compress'; SELECT @@GLOBAL.have_compress; SHOW GLOBAL VARIABLES LIKE 'have\_crypt'; SELECT @@GLOBAL.have_crypt; SHOW GLOBAL VARIABLES LIKE 'have\_csv'; SELECT @@GLOBAL.have_csv; SHOW GLOBAL VARIABLES LIKE 'have\_dynamic\_loading'; SELECT @@GLOBAL.have_dynamic_loading; SHOW GLOBAL VARIABLES LIKE 'have\_example\_engine'; SELECT @@GLOBAL.have_example_engine; SHOW GLOBAL VARIABLES LIKE 'have\_federated\_engine'; SELECT @@GLOBAL.have_federated_engine; SHOW GLOBAL VARIABLES LIKE 'have\_geometry'; SELECT @@GLOBAL.have_geometry; SHOW GLOBAL VARIABLES LIKE 'have\_isam'; SELECT @@GLOBAL.have_isam; SHOW GLOBAL VARIABLES LIKE 'have\_merge\_engine'; SELECT @@GLOBAL.have_merge_engine; SHOW GLOBAL VARIABLES LIKE 'have\_ndbcluster'; SELECT @@GLOBAL.have_ndbcluster; SHOW GLOBAL VARIABLES LIKE 'have\_openssl'; SELECT @@GLOBAL.have_openssl; SHOW GLOBAL VARIABLES LIKE 'have\_ssl'; SELECT @@GLOBAL.have_ssl; SHOW GLOBAL VARIABLES LIKE 'have\_query\_cache'; SELECT @@GLOBAL.have_query_cache; SHOW GLOBAL VARIABLES LIKE 'have\_raid'; SELECT @@GLOBAL.have_raid; SHOW GLOBAL VARIABLES LIKE 'have\_rtree\_keys'; SELECT @@GLOBAL.have_rtree_keys; SHOW GLOBAL VARIABLES LIKE 'have\_symlink'; SELECT @@GLOBAL.have_symlink; SHOW GLOBAL VARIABLES LIKE 'init\_file'; SELECT @@GLOBAL.init_file; SHOW GLOBAL VARIABLES LIKE 'innodb\_additional\_mem\_pool\_size'; SELECT @@GLOBAL.innodb_additional_mem_pool_size; Ruby program to generate list: #!/usr/bin/ruby -w # sysvar2.rb - Discover global system variables that are shown by SHOW # variables but cannot be selected via SELECT @@GLOBAL.var_name. require "optparse" require "dbi" # variable-scope constants GLOBAL = 1 SESSION = 2 def test_sysvar(dbh, var_name, scope) scope_name = (scope == GLOBAL ? "GLOBAL" : "SESSION") begin row = dbh.select_one("SELECT @@#{scope_name}.#{var_name}") rescue DBI::DatabaseError => e # print statements that will show the variable is displayed by SHOW # variables but cannot be selected with SELECT. esc_var_name = var_name.gsub(/_/, "\\_") puts "SHOW #{scope_name} VARIABLES LIKE '#{esc_var_name}';" puts "SELECT @@#{scope_name}.#{var_name};" end end # ---------------------------------------------------------------------- # main program # ---------------------------------------------------------------------- host_name = "127.0.0.1" port_num = 3306 opts = OptionParser.new do |opts| opts.summary_indent = "" opts.summary_width -= 3 opts.banner = "Usage: #{$0} [options] command" opts.on("-?", "--help", "Display this message and exit") do puts opts exit 0 end opts.on("-h", "--host=host_name", String, "Host to connect to") do |str| host_name = str end opts.on("-P", "--port=port_num", Integer, "TCP/IP port number") do |val| port_num = val end end opts.parse!(ARGV) # Expect no more arguments unless ARGV.empty? puts opts exit 1 end dsn = "dbi:Mysql:host=#{host_name};port=#{port_num}" + ";mysql_read_default_group=client" dbh = DBI.connect(dsn,nil,nil) dbh.select_all("SHOW GLOBAL VARIABLES").each do |row| test_sysvar(dbh, row[0], GLOBAL) end dbh.select_all("SHOW SESSION VARIABLES").each do |row| test_sysvar(dbh, row[0], SESSION) end dbh.disconnect if dbh